Android中的回调机制
使用java的回调机制已经很久了,就Android开发来说,回调机制在异步任务上使用的很频繁,但是其本质上的原理是什么,很好奇,但是一直无从下手,先分析使用java回调产生的几种现象:
1.当需要知道一个耗时任务完成的结果时,不用去轮询查看进度或者等待到任务完成了,而是从阻塞等待、主动检查变成被动接收任务的结果了。比如:下载一张图片,完成时从UI上给一个反馈;
2.一个任务执行完毕的结果从接口方法的参数中传递回来了;
再考虑两种任务执行方式:
1.同步:当执行耗时任务时,客户端一直等待,直到任务完成
2.异步:
(1)有耗时任务时,新开一个线程让耗时任务在后台进行,如果关心进度,就让任务在完成时,把结果返回回来。
(2)耗时任务在运行中,谁关心进度谁去主动查询,这种好像理解起来很像同步任务,因为他也是需要从交互上主动去查询进度,但是从整个任务的执行上是异步的。
3.怎么区分同步和异步?
(1)对同步来说,整个任务,是一个时间线,需要开始一件事,就等到它完成再去做下一件事;
(2)对异步来说,关心任务进度&结果的是交互操作上的时间线,而真正执行任务的是后台时间线,可以理解为多件事情同时进行,不同的事情各自执行自己的事情,有自己的进度,如果有需要也可以任务间进行通信。
一.对回调函数的理解:
回调函数简单的说就是通过其指针来调用的函数,他不会被自己所在的对象调用,只会在调用别人的方法时反过来被调用。我们都知道Android程序是通过java语言来实现的,java中并没有指针,因此回调都是通过接口或抽象类。
回调的过程:在A类中定义一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法并没有具体的实现,需要B类去实现。当B类实现该方法后,他本身不会调用该方法,而是传递给A类,供A类去调用。这样的一个机制称为回调。
下面是一个回调机制的一个实例,可以帮助理解:
package cn.test.callback;
/**
*
* @author zhiyuan
* 声明一个接口
*/
public interface ICallBack {
void postExec();//声明了方法但没有实现,让其他的类去实现方法的定义
}
/***声明Foobar类*/
package cn.test.callback;
public class Foobar {
private ICallBack callback;
public void setCallBack(ICallBack callback){
this.callback = callback;
}
public void doSth() {
//实现postExec()方法但没被Foobar对象调用
System.out.println("Foobar------doSth()");
callback.postExec();
}
public static void main(String[] args) {
Foobar foo = new Foobar();
//实现了接口,没有调用方法
foo.setCallBack(new ICallBack(){
@Override
public void postExec() {
System.out.println("postExec被调用!");
}
});
foo.doSth();
}
}
运行结果:
Foobar------doSth()
postExec被调用!
由运行的结果可以看出,Foobar类中的doSth方法只是用callBack.postExec的方式实现postExec抽象方法。真正的调用是在接口ICallBack中,当接口ICallBack被实现后,调用了被Foobar类实现的postExec方法。
二.在android代码中,回调机制也是使用的非常多的,下面就我们经常写的Android代码,分析其中的回调方法
(1)事件监听器的回调
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getContext(),"You Clicked Edit button",Toast.LENGTH_SHORT).show();
}
});
上面的代码给Button按钮添加一个时间监听器,自己不会显示的调用OnClikc()方法,只有在用户触发了该按钮的点击事件后,它才会由Android系统来自动调用。
(2)Activity生命周期的回调
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
.......
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onRestart() {
super.onRestart();
}
}
上面的代码是创建Activity时,系统自带的OnCreate()方法,该方法不会被人为调用,但那时他会在android系统自动调用。