不管在java中还是android中回调都用的很多,比如自定义listview 下拉刷新,listview这个类并不知道下拉中要去实现什么功能,而只知道当用户下拉要刷新,这不就是接口的作用么,接口只定义外观,具体的实现要子类去实现,这是其一,其二,listview既然不知道下拉刷新的功能是什么,还要等调用他的类去实现,因此就要用到回调,
回调的定义:
用我个人理解的话:就是某个功能,在中间某段并不知道要实现什么,要等外部调用者调用时才知道,而在某个功能中只知道要实现什么功能,但是具体的实现确实在调用类中实现,这就是接口回调,现在用代码来解释更明白
首先定义一个接口,用于回调的
/** * 用于回调的接口 */ public interface OnClickListener { void onClick(); }
在定义一个Button,用于实现某些功能,
public class Button { private OnClickListener listener; private MyInterface interfacer; public void setOnClickListener(final OnClickListener listener) { this.listener = listener; } }
这是模拟android中button的点击事件,
MainClass.java
public class MainClass implements OnClickListener { public static void main(String[] args) { System.out.println("this is main"); new MainClass().callBack(); } public void callBack(){ Button btn = new Button(); btn.setOnClickListener(this); } @Override public void onClick() { System.out.println("接口回调"); } }
打印结果:
this is main 接口回调
现在分析回调,
1:首先定义一个接口,用于回调,
2:在要被调用的类中,在这个代码中Button就是要调用的类,在这个类中setOnClickListener()方法并没有实现任何代码,只是调用了接口中的OnClick()方法,相当于声明方法体,并没有具体的实现,而在MainClass类中我们发现OnClick()方法中打印了一句话System.out.println("接口回调");这可以看做是onClick()方法具体的实现,所以说回调的方法是 声明和实现分离的,
3:注册监听器:public void setOnClickListener(OnClickListener listener) ;这个方法就是注册监听器,然后定义变量接受外部传递过来的接口变量,在外部传递过来的是接口的实现类,这里就用到了多态的概念了,
4:在Button类中定义一个方法实现某一逻辑,但是这个逻辑也是某个部分不知道怎么实现,
代码部分改动:
Button.java
public class Button { private OnClickListener listener; public void setOnClickListener(OnClickListener listener) { this.listener = listener; } public void move(){ System.out.println("移动前------"); listener.onClick();//比如移动中要处理很多业务 System.out.println("移动后------"); } }
MainClass.java
public class MainClass implements OnClickListener { public static void main(String[] args) { new MainClass().callBack(); } public void callBack(){ Button btn = new Button(); btn.setOnClickListener(this); btn.move(); } @Override public void onClick() { System.out.println("移动中................"); } }
调用类要做的事:
1:new 一个被调用类的对象
2:然后注册监听器
具体的代码提现在:
Button btn = new Button(); btn.setOnClickListener(this);
被调用类还有一种写法:
Button.java<pre class="java" name="code">public class Button { public void setOnClickListener(OnClickListener listener) { System.out.println("移动前------"); listener.onClick();//比如移动中要处理很多业务 System.out.println("移动后------"); } }
调用者也有一个写法:
public class MainClass { public static void main(String[] args) { new MainClass().callBack(); } public void callBack(){ Button btn = new Button(); btn.setOnClickListener(new OnClickListener() { @Override public void onClick() { System.out.println("移动中................"); } }); } }
大家可以对比android中一些view的点击事件来看,就是这样的,理解接口对学设计模块有很大的帮助!希望大家一起好好学习,有什么地方讲的不对,请回复!