有哥们问我回调怎么用, 回调怎么理解? 怎么说好呢, 只可意会不可言传呐, 非也, 回调在实际开发中使用频率其实是很高的, 恰好我小时候也被回调函数欺负过, 竟然问了, 那么肯定要好好分享一下我的一些经验.
网传回调的理解
所谓的回调函数就是:在 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;
- }
- }
再继续看下面代码:
销售需要设置监听, 才知道工人几时才生产完机器.
- /**
- * 销售只要负责卖就可以了
- *
- * @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("销售开始卖机器给老外了...");
- }
- }
- 点击事件
我目前所见过的回调都是在一个特定的条件下才发生的方法回调(例如按钮的 onClick(); 最常见)
我先分析下要做实事的是不是对应的
里, 需要被监听观察是否有点击状态的是否就
- activity/fragment或者adapter
.
- 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));?
- }});
来源: http://www.bubuko.com/infodetail-1966411.html