zoukankan      html  css  js  c++  java
  • 一个故事理解什么是接口回调

    接口回调

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



  • 相关阅读:
    关于深拷贝和浅拷贝的理解
    Oracle数据库入门
    单例模式入门
    oracle存储过程 (还没动手实践、剩余内容找时间在处理、游标还没接触)
    Oracle用户名及默认密码
    oracle数据库怎么创建数据库实例
    Java 强、弱、软、虚,你属于哪一种?
    内存溢出和内存泄漏的区别
    aop中execution 表达式
    JPA 中@Enumerated
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299494.html
Copyright © 2011-2022 走看看