Android回调接口的使用,相信很多人和我一样已经用过多次,但是理解起来却是一知半解的阶段,下面整理一下我对回调接口的使用,欢迎各位专家大神批评指正。
回调机制是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。
定义:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口 中的方法,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,称为接口回调。不同的类在使用同一接口时,可能具有不同的功能体 现,即接口的方法体不必相同,因此接口回调可能产生不同的行为。
回调函数使用的简单例子
程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。目的达到。在JAVA中通过接口(interface)来实现定义回调函数。
以下代码写了一个异步下载时使用回调接口:
/**
* 下载帮助类
*
*/
class HttpUtils {
// 下载方法,回调接口对象作为一个参数
public void download(String url, onCompleted onCompleted) {
try {
// 睡眠3秒,模拟下载操作
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
onCompleted.doSomething();
}
// 预留有回调函数接口
public interface onCompleted {
public abstract void doSomething();
}
}
在activity的oncrete方法中调用下载帮助类的download方法下载文件,耗时操作要放在子线程中,于是,activity中通过下载帮助类中预留的接口回调自己中的backMethod方法。
public class CallBackActivity extends Activity implements onCompleted {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_call_back);
final HttpUtils httpUtils = new HttpUtils();
// 开启线程下载
new Thread(new Runnable() {
@Override
public void run() {
httpUtils.download("http://www.baidu.com/img/8ia.jpg",
CallBackActivity.this);
}
}).start();
}
@Override
public void doSomething() {
backMethod();
}
// 此方法就是被回调的方法
private void backMethod() {
// TODO 除此之外还能做自定义操作
Log.i("下载完毕", "调用该回调方法通知一声");
Log.i("Main", "我是一个回调方法");
}
}
回调机制可理解为传递代码,通过使用接口对象,实现接口的抽象方法, 普通方法传递参数对象,回调传递代码
我们需要一次性的把处理程序作为对象注册到服务中,服务中保存一个指向处理程序的指针。此后,无论何时发生一个指定的事件,服务将查询保存的引用列表,回调已经注册的每一个处理程序对象。(结合按钮监听器【源码】理解)
所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。Web Service以及Java的RMI都用到回调机制,可以访问远程服务器程序。
下面举个通俗的例子:
某天,我打电话向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
通过上面个人感觉到回调更多的应用就是结合异步。