有哥们问我回调怎么用,回调怎么理解?怎么说好呢,只可意会不可言传呐,非也,回调在实际开发中使用频率其实是很高的,恰好我小时候也被回调函数欺负过,竟然问了,那么肯定要好好分享一下我的一些经验.
网传回调的理解
所谓的回调函数就是:在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体的实现,需要B类去实现,B类实现该方法后,它本身不会去调用该方法,而是传递给A类,供A类去调用,这种机制就称为回调。
估计看完已经晕在厕所了,可以暂时忽略…
那么从现在开始可以先用我的三要素来理解,之前的可以暂时忘记.
回调我这边总结了有三要素:
- 接口:
哪里需要被监听
,接口就写在那里. - 引用: 要有引用才可以
对被监听者进行设置监听
. - 实现:
哪里需要数据/结果
,就在那里进行实现
销售卖机器的例子
一个销售向工人订了100台机器准备卖给老外,让工人在生产完100台机器后通知下他.
对于这个需求我们可以用回调监听
来处理
我们先缕一缕思路:
在这个需求里,我们用刚刚的三要素定位下.
- 哪里需要被监听 -> 工人 (监听工人工作进度)
- 哪里需要结果 -> 销售 (得到工人生产的结果)
- 对被监听者进行设置监听 -> 销售 (因为结果最终在销售类里获得,因此设置监听要在这里)
我们来看看下面的代码:
工人类需要对生产机器的进去进行监听.
/**
* 工人类
* 1. 只要负责生产
* 2. 生产完之后告诉经理
* @author relicemxd
*
*/
public class Worker {
private WorkListner listner;
/**
* 制造机器:
* 工人特有的方法
*/
public void makeMachine() {
int num = 100;
for (int i = 0; i < num; i++) {
if (num >= 50) {
continue;
}
}
// 满足100台机器,通知可以进行下一步操作
listner.onWorkListner(num);
}
/*
* 监听工人生产情况的接口
*/
public interface WorkListner {
//对满足条件后,进行事件操作的方法
void onWorkListner(int num);
}
/**
* 设置监听工人生产情况的方法
* @param listner 接扣要在需求方被实现
*/
public void setOnWorkListner(WorkListner listner) {
this.listner = listner;
}
}
上面要对工人的工作情况进行观察,因此
WorkListner
接口和setOnWorkListner(WorkListner listner)
设置监听的方法就写在Worker
工人类.
再继续看下面代码:
销售需要设置监听,才知道工人几时才生产完机器.
/**
* 销售只要负责卖就可以了
*
* @author relicemxd
*
*/
public class Seller {
public static void main(String[] args) {
//1. 销售要卖机器首先要有机器,谁生产机器? 找到工人
Worker work = new Worker();
//2. 销售要卖多少台机器? 告诉工人
work.setOnWorkListner(new WorkListner() {
@Override
public void onWorkListner(int num) {
System.out.println("现在已经生产完成,共 "+num +" 台机器");
//当工人生产完成后就可以卖机器了
sell();
}
});
//3. 工人明确要生产多少台机器后就可以开干了. 让工人生产100台机器
work.makeMachine();
}
/**
* 卖机器:
* 只有销售才有的方法
*/
private static void sell() {
System.out.println("销售开始卖机器给老外了...");
}
}
要想知道机器的进度情况,那么就肯定要有
new Worker()
工人对象,此时有了工人的引用,接着要什么需求就吩咐工人(做100台机器)并告之工人做完给反馈work.setOnWorkListner(listner)
,工人开始按需求做机器了work.makeMachine()
,做完后就会进行反馈回调,告之销售可以拿去卖了onWorkListner(int num) { TODO }
如果还有疑惑的继续看android中的常见回调点击事件
我目前所见过的回调都是在一个特定的条件下才发生的方法回调(例如按钮的onClick();最常见)
我先分析下要做实事的是不是对应的activity/fragment或者adapter
里,需要被监听观察是否有点击状态的是否就Button
.
好我知道来来龙去脉后,用三要素苏通下:
- 接口: Button
在源码中可以看到,设置监听的方法写在Button
里类,而OnClickListener
写在Button
的父类View
里.
public void setOnClickListener(@Nullable OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
- 实现和引用
在activity
里,当点击了button
后,我需要打开一个页面MainActivity
,因此button
的应用和setOnClickListener(listner)
方法都写在了这个activity
里.
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mActivity.startActivity(new Intent(mActivity, MainActivity.class));
}});