转载请注明出处:flowsky37的博客,尊重他人辛苦劳动!
接口回调简单理解就是:类A中调用B类的中方法C,而B又反过去调用A中的方法D,然后D称为A的回调方法。是不是心中有一万只草泥马在奔腾,到底说的是什么。感觉像是你中有我,我中有你,纠缠不清。
举个通俗易懂的例子,比如顾客是A,厨师是B。面粉是接口Callback。然后面粉的吃法D是在顾客A的手中,厨师B有包子的做法C。现在需求是A有面粉,想吃包子,但是A是不会做包子,就需要去找厨师,让他调方法C做包子,A就把面粉Callback给了厨师,至于厨师怎么做,A不管,A只要你做好了给我一个结果(包子)就OK了。至于包子怎么吃,我是直接吃,还是蘸点醋吃,那是A的事了(A怎么吃的过程就是方法D里具体执行的代码)。
下面结合一个简单的例子看就容易多了。
首先是定义接口(面粉):
package com.example.interfacecallbackdemo;
public interface Callback {
//因为是一堆面粉,肯定是没法吃的,所以没有具体的方法体,俗称“吃法”
public void D(String result);
}
然后定义A类(客户):
package com.example.interfacecallbackdemo;
public class A implements Callback{
/**
* B类引用
*/
private B b;
public A(B b) {
this.b = b;
}
/**
* A类通过该方法调用B的方法C(可理解为找到厨师并将面粉给他)。
*/
public void selectMenu(){
b.C(this);
}
/**
* A类中的D方法,也称为A类的回调方法(厨师做好包子将包子(result)返回给顾客A)
*/
@Override
public void D(String result) {
System.out.print(result);
}
}
然后是B类:
package com.example.interfacecallbackdemo;
public class B {
/**
* B类的C方法(接受面粉Callback,然后开工做包子,做好后返回给客户A)。
*/
public void C(Callback callback){
String result = "2";
callback.D(result);
}
}
再加上一个执行的对象,我是利用android中button调用的:
package com.example.interfacecallbackdemo;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener{
private A a;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_main)
.setOnClickListener(this);
a = new A(new B());
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_main:
a.selectMenu();
break;
default:
break;
}
}
}
(ABCD分别对应什么自己脑补,很easy吧)前面说的是A 调用B中的方法C,B又反过来调用A中的方法D。在代码中我就直接用ABCD ,简单、直接、粗暴。
但是,B类的C方法的参数不必一定要把Callback作为参数,如果C方法中没有这个参数,那在B类中一定要在其它地方把Callback接收进来。比如,我把B类稍微改动一下:
package com.example.interfacecallbackdemo;
public class B {
private Callback callback;
public B(Callback callback){
this.callback = callback;
}
/**
* B类的C方法
*/
public void C(){
String result = "2";
callback.D(result);
}
}
此时A类也要做相应的调整:
package com.example.interfacecallbackdemo;
import android.util.Log;
public class A {
/**
* B类引用
*/
private B b;
/**
* A类同过该方法调用B类的C方法
*/
public void selectMenu(){
b = new B(new Callback() {
@Override
public void D(String result) {
System.out.print(result);
}
});
b.C();
}
}
呃,这个算是标准版的变异版,其实也是很简单的,毕竟这种可能是大家项目中实际中会见到而不至于弄不清楚,但是有一点,C方法中一定会有接口的实例对象调用其抽象方法。其实我们不需要按接口回调的定义去对比,重要的是理解其原理机制,只需记住,哪个类传递Callback实例对象过去的,就是我们所说的A,接受的就是B。
接口回调在android中是非常常见的,典型的就是各种监听器了,如果去分析下源码,你就会发现跟上面得那个例子大同小异。
上面是个人对接口回调的一些理解,如果有不明白的,可以留言;如果某些地方有误,非常欢迎指出,谢谢!**