上篇http://blog.csdn.net/u010289775/article/details/42530505 讲了aidl跨进程回调,这次讲讲回调机制,跟上一篇有点类似,但是这是单进程中的回调
一.回调函数
回调函数是通过一个函数指针(地址)调用的函数。如果你把函数的指针当成参数传递给另一个函数,那么当这 个指针被用来调用它所指向的那个函数时,我们就称这是回调函数。回到函数并不是由实现该函数的一方直接调 用,而是在一定的条件下由另一方调用,来响应实现函数方的过程!
模拟场景:网上很多人用的例子,打电话 (A,B代表两个人)
某天A碰到了一个很棘手的问题,A就打电话问B,说:“1+1=?” ,B说这个问题有点难,我需要一点时间处理,然后A不想在哪里等,就告诉B说:你要是解决了,告诉通知我一声,B就答应了。过来一段时间,B打电话告诉说:A问题解决了。这个过程是“异步+回调”的过程,B打电话告诉A的过程就是一个回调。
二.android回调
在Java中不允许直接对指针进行操作,那么Java是通过什么来完成回调了?
Java是通过接口(implements)来实现的,在Android中很典型的例子,就是Activity的生命周期。onCreate()-->onStart()-->onResume()-->onPause-->onStop()-->onDestroy()-->onRestart();
如果实现回调了?
1.定义一个内部接口ICallback,同时给予回调方法callback();
2.声明一个ICallback接口对象mCallback
3.提供一个方法setCallback(ICallback callback)来设置ICallback接口对象mCallback
public class CustomView extends LinearLayout {
private TextView mRefreshUI;
private IRefreshCallback mRefreshCallback;
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
private void initView(Context context) {
LayoutInflater inflater =(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.mymain, this);
mRefreshUI = (TextView) findViewById(R.id.btn1);
mRefreshUI.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mRefreshCallback.refreshUI();调用回调函数
}
});
}
public void setRefreshCallback(IRefreshCallback callback){
mRefreshCallback = callback;//设置接口对象
}
interface IRefreshCallback{
void refreshUI();//回调函数
}
}
在Activity中编写:
<span style="font-size:18px;">public class MyActivity extends Activity implements IRefreshCallback{
private CustomView tv;
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.mymain);
tv = new CustomView(this, null);
tv.setRefreshCallback(this);
}
@Override
public void refreshUI() {
Log.i("show", "refreshUI");//具体的刷新UI的操作
}
}</span>
回调就写完了,当点击自定义控件中的按钮时,logcat就会打印 refreshUI
只是借这样个例子讲回调函数,在实际开发中回调一般不会用在这种地方,这太小儿科了。例如在ListView的下拉刷新,上拉加载更多就用了回调。