<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">费了一些时间研究学习回掉。都是自我的理解,有不正确的地方请指正。</span>
网上的例子动不动一上来就来个接口,完全不知道干嘛的,自己想想过程,然后弄了这个。
java中:
一、简单版的:
classA调用classB中的m()方法,而m()方法中却又调用了classA 中的n()方法。这就是回调。
上代码:
public class ClassA0 {
ClassB0 b0 = new ClassB0();
public void testA0Method(){
System.out.println("这里去调用ClassB0的m()方法");
b0.m(ClassA0.this);
}
public void n(){
System.out.println("方法n0被调用了。");
}
}
package demo1;
public class ClassB0 {
public void m(ClassA0 a0) {
System.out.println("方法m0被调用了。");
a0.n();
System.out.println("返回调用ClassA0的n()方法");
}
}
这个例子比较简单,但是日常工作中不可能只有这样简单的调用,如果在n()方法中有多种不同的操作 [PS:不会组织语言了,就是多态的意思,理解理解] 这个时候就引入接口interfaceC。把n()方法放到接口中,然后让classA去实现n()方法。
二、进阶版的
引入Inerface,实现了回掉方法的重用(就这么叫吧,如果不合适请指正)。在ClassB中对原来ClassA的引用现在变成了对其接口的引用,是其不再是单一的调用。
上代码
package demo2;
public interface Interface1 {
public void n();<strong><span style="color:#ff0000;">//这里的n()是可以带参数的,如果想回掉方法中得到一个返回的值可以把这个参数放在这个方法中</span></strong>
}
package demo2;
public class ClassB1 {
public void m(Interface1 i1) {<strong><span style="color:#ff0000;">//这里变成了对接口的引用,实际的n()方法是接口的实现对象所实现的。</span></strong>
System.out.println("方法m0被调用了。");
i1.n();
System.out.println("返回调用Interface1实现类中的n()方法");
}
}
package demo2;
public class ClassA1 implements Interface1{
ClassB1 b0 = new ClassB1();
public void testA0Method(){
System.out.println("这里去调用ClassB0的m()方法");
b0.m(ClassA1.this);
}
public void n(){
System.out.println("ClassA1中的方法n0被调用了。");
}
}
package demo2;
public class ClassC1 implements Interface1 {
ClassB1 b0 = new ClassB1();
public void testA0Method(){
System.out.println("这里去调用ClassB0的m()方法");
b0.m(ClassC1.this);
}
public void n(){
System.out.println("ClassC1中的方法n0被调用了。");
}
}
package demo2;
public class MainTest1 {
public static void main(String[] args) {
new ClassA1().testA0Method();
System.out.println("-------我是分割线----------------------------");
new ClassC1().testA0Method();
}
}
最后的结果:
到此这样循序渐进的理解了吧?
这里有个不错的博客http://www.codeceo.com/article/java-asyn-callback.html。
Android中:
有了以上的基础,再来看看Android中的。
最常见的就是onclickListener中的回调。
看看系统的源码
//相当于ClassB
public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {
<span style="background-color: rgb(255, 255, 102);"><strong><span style="color:#33ff33;"> </span><span style="color:#3333ff;">// 接口实例,相当于上面例子的interface1的实例</span></strong>
protected OnClickListener mOnClickListener; <span style="color:#336666;">//<strong>这个inerface是定义在View类中的一个内部的interface</strong></span></span>
<span style="color:#000099;"> <span style="background-color: rgb(255, 255, 102);"><strong>// 接口实例化,相当于上面例子的m()方法</strong></span></span>
public void setOnClickListener(OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
mOnClickListener = l;
}
<span style="white-space:pre"> </span><span style="background-color: rgb(255, 255, 102);">//这中间有好多的调用关系,有兴趣自己看看源码</span>
public boolean performClick() {
if (mOnClickListener != null) {
<span style="background-color: rgb(255, 255, 102);"><span style="color:#000099;"><strong> //B类调用A类的实现方法,相当于上面的n()方法 </strong></span>
mOnClickListener.onClick(this); </span>
return true;
}
return false;
}
相当于ClassA,ClassC
public class MainActivity extends Activity implements <strong style="background-color: rgb(255, 204, 102);"><span style="color:#000099;">OnClickListener</span></strong>{
private Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.button1);
// A类实例化接口
button.<strong style="background-color: rgb(0, 0, 153);"><span style="color:#ffcc00;">setOnClickListener(this)</span></strong>;
}
<span style="color:#ffcc00;background-color: rgb(0, 0, 153);">@Override
public void onClick(View v) {
// 回调函数
}</span>
只不过平时喜欢写成内部类而已。
最后附上java的回调源码:http://download.csdn.net/detail/xzgww0902/9494939,android的就不附了。