接口回调
- 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("李老师");
}
}
运行结果截图如下: