Android中的回调机制

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系统自动调用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TechMix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值