网上也有很多这方面的资料,但是自身理解才最重要,为了加深印象自己分析举例来理解。
百度概念一大堆,所以不想在这里做任何叙述,这里借助一个现实生活示例,贷款人向银行工作人员贷款的过程来解释回调原理。
基本流程:
1.需要贷款的人先向银行发起贷款的申请(注册回调事件)
2.这里有个回调的共性,调用对象需要处理完数据之后才能通过回调方法传递数据。例如:要等到银行工作人员处理好手续之后,才能把贷款金通过贷款人事先约定好的方法(回调方法)把贷款借给他。
这里有个疑问?贷款人有个收钱的方法,那么这个方法其实我们可以不用定义接口,银行工作人员回调的时候直接 new Workers().collectMoney()方法实现的,这样他也实现了回调。但是为什么要用接口呢?这里牵扯到一个抽象的概念,把它抽成接口,不管是那个类型的人,只要实现了收钱的接口都会有收贷款金的功能了。这样代码的扩展性和灵活性得到了提升。
---------------------------------------------------------------------------------------------------------------------------
回调不匿名的实现:
public interface CollectMoneyCallback {
//抽取贷款人收钱的方法
void collectMoney(int money);
}
//工人实现了接受贷款的功能
public class Workers implements CollectMoneyCallback {
//工人向银行贷款
public void borrowBankMoney(int money){
new BankStaff().borrowMoney(money,this)
}
@Override
public void collectMoney(int money) {
System.out.println("工人收到了银行" + money + "元贷款金");
}
}
//老板实现了接收贷款的功能
public class Boss implements CollectMoneyCallback {
//老板向银行贷款
public void borrowBankMoney(int money){
new BankStaff().borrowMoney(money,this)
}
@Override
public void collectMoney(int money) {
System.out.println("老板收到了银行" + money + "元贷款金");
}
}
//银行工作人员
public class BankStaff{
//贷款
public void borrowMoney(int money,CollectMoneyCallback callback){
//工作人员办理了手续拿到了贷款的钱
int loansMoney = handle(money);
//通过回调给了贷款的人
callback.collectMoney(loansMoney);
}
/**
* 办理贷款手续
* @param money 办理的金额
* @return 放款的金额
*/
public void handle(int money){
int mMoney;//放款的金额
if(money == null) return mMoney;
mMoney = money;
System.out.println("办理完" + money + "元贷款手续");
return result;
}
}
//测试类
public class Test {
public void test(){
new Workers().borrowBankMoney(20000);
new Boss().borrowBankMoney(500000);
}
}
回调匿名的实现:
public interface CollectMoneyCallback {
//抽取贷款人收钱的方法
void collectMoney(int money);
}
//银行工作人员
public class BankStaff{
public CollectMoneyCallback callback;
public void setCallback(CollectMoneyCallback callback) {
this.callback = callback;
}
//贷款
public void borrowMoney(int money,CollectMoneyCallback callback){
//工作人员办理了手续拿到了贷款的钱
int loansMoney = handle(money);
//设置回调监听
setCallback(callback);
//通过回调给了贷款人钱
performCollectMoneyCallback(money)
}
/**
* 办理贷款手续
* @param money 办理的金额
* @return 放款的金额
*/
public void handle(int money){
int mMoney;//放款的金额
if(money == null) return mMoney;
mMoney = money;
System.out.println("办理完" + money + "元贷款手续");
return result;
}
//执行首先回调
public void performCollectMoneyCallback(int money){
if (callback != null){
System.out.println("银行工作人员放贷" + money + "元");
callback.collectMoney(money);
}
}
}
//测试类
public class Test {
public void test(){
new BankStaff().borrowMoney(2000, new CollectMoneyCallback() {
@Override
public void collectMoney(int money) {
System.out.println("老板张三收到了银行工作人员" + money + "元贷款金");
}
});
new Lisi2().returnMoney(50000,callback);
}
CollectMoneyCallback callback = new CollectMoneyCallback() {
@Override
public void collectMoney(int money) {
System.out.println("员工李四收到了银行工作人员" + money + "元贷款金");
}
};
}
最后的话:纯属个人分析理解,如果有什么不对欢迎指正,如果对你进行了帮助那就皆大欢喜啦,如果有愿意讨论分析各种andoird技术可以与我联系,谢谢观看。