一个故事理解什么是接口回调

来源:互联网 发布:网络音箱 编辑:程序博客网 时间:2024/05/22 01:57

接口回调

  • 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 TimermTimer;/**想睡觉方法*/public void wantSleep() {System.out.println("昨晚敲代码敲到4点钟,突然想睡觉...");}/**开始睡觉方法*/public void startSleep() {mTimer = new Timer();mTimer.schedule(new TimerTask() {@Overridepublic 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.定义接口对象OnTeacherComeListenermOnTeacherComeListener;/** * 方式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();//李老师是班主任,我停止睡觉}}@Overridepublic 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开发技术。



1 0
原创粉丝点击