Android回调机制

上篇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的下拉刷新,上拉加载更多就用了回调。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值