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

接口回调

  • 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开发技术。



原文地址:https://www.cnblogs.com/wanghang/p/6299494.html