一个故事理解什么是接口回调
接口回调
- handler机制+thread
- 怎么理解接口回调-->接口回调就是一个通知机制
- 作用:1.单纯的通知 2.通知+传值
- 步骤:
- 1.定义接口,以及接口方法
- 2.定义接口对象
- 3.在某一个地方.接口对象调用接口方法
- 4.暴露接口对象(构造方法,setter方法)
接口回调实例
//1.
public static interface OnCheckedChangeListener {
void onCheckedChanged(CompoundButton buttonView, boolean isChecked);
}
//2.
private OnCheckedChangeListener mOnCheckedChangeListener;
//3.
mOnCheckedChangeListener.onCheckedChanged(this, mChecked);
//4.
public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
mOnCheckedChangeListener = listener;
}
对于接口回调,上边大致做了一个总结与概述,相信看着有些晦涩;个人感觉通过下面的例子来理解既有趣又非常形象。
例子:
我昨晚敲代码敲到了4点
第二天精力不行,想要睡觉
和同桌商量一下,班主任来了叫醒我
上边的故事就是回调,我的一些过程就是要让同桌监听老师的动作,所以老师的动作就要定义为接口,而合适调用老师的动作方法呢?就是同桌,因为同桌的动作决定我的动作。回调是不一定执行的代码,遇到某个条件才回去调用实现类里面的方法。
那么就通过代码,表述这个过程:
首先,对于“我”的一些方法:
public class Me { private Timer mTimer; /**想睡觉方法*/ public void wantSleep() { System.out.println("昨晚敲代码敲到4点钟,突然想睡觉..."); } /**开始睡觉方法*/ public void startSleep() { mTimer = new Timer(); mTimer.schedule(new TimerTask() { @Override public void run() { System.out.println("开始呼呼大睡........."); } }, 0, 1000);//每隔1秒睡一次 } /**停止睡觉*/ public void stopSleep() { if (mTimer != null) { mTimer.cancel(); mTimer = null; System.out.println("停止了睡觉"); } } }老师的动作定义为接口:
*/ // 1.定义接口,以及接口方法 public interface OnTeacherComeListener { void onTeachCome(String teacherName); void onTeachCome(); }同桌显然要调用老师的方法,用于监听老师的动作。同桌类的方法如下:
public class ClassMate { // 2.定义接口对象 OnTeacherComeListener mOnTeacherComeListener; /** * 方式1:通过构造方法赋值 */ public ClassMate(OnTeacherComeListener onTeacherComeListener) { super(); mOnTeacherComeListener = onTeacherComeListener; } public ClassMate() { super(); } /**模拟老师来了,模拟老师来了同时,告知老师名字*/ public void doTeacherCome(String teacherName) { // 3.在某一个地方.接口对象调用接口方法-->老师来了的时候。本质调用实现类的方法 mOnTeacherComeListener.onTeachCome(teacherName); } // 4.暴露接口对象(构造方法,setter方法) /** * 方式2:通过setter赋值 */ public void setOnTeacherComeListener(OnTeacherComeListener onTeacherComeListener) { mOnTeacherComeListener = onTeacherComeListener; } }最后就是测试方法:
public class Test {
public static void main(String[] args) {
final Me me = new Me();
// 我想睡觉
me.wantSleep();
// 找到一个同桌
ClassMate classMate = new ClassMate();
System.out.println("我去和同桌协商......");
// 和他商量好-->如果老师来了.你拍醒我.让我停止睡觉。同桌设置监听器
classMate.setOnTeacherComeListener(new OnTeacherComeListener() {//接口实现类
@Override
/**老师来了,立即触发这里*/
public void onTeachCome(String teacherName) {// 通知+传值的效果
if ("伍老师".equals(teacherName)) {// 回调过程中.有传值的效果
System.out.println("伍老师不是班主任,我继续睡觉");
} else if ("李老师".equals(teacherName)) {
me.stopSleep();//李老师是班主任,我停止睡觉
}
}
@Override
public void onTeachCome() {// 没传值,只是通知的效果
}
});
// 模拟商量了2s钟
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 我开始睡觉
me.startSleep();
// 10s后模拟伍老师来了.
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//同桌监听到了老师来到
classMate.doTeacherCome("伍老师");
// 模拟伍老师来了.
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
classMate.doTeacherCome("李老师");
}
}
运行结果截图如下:
喜欢我的朋友可以关注我哦~
也可以扫描下方的二维码,或搜索公众号 Android程序员开发指南 去微信每日阅读一篇安卓开发文章。
长按上方二维码,关注本公众号一起交流Android开发技术。