Android 关于回调的一点总结

<pre name="code" class="java">上班以来的半个月,接触的代码里出现次数较多的就是 回调函数 自己在这之前并没有接触过这种函数,所以在网上找到了一些文章,讲的还是蛮形象的

 

一、建模

我理解的接口回调就是,我这个类实现了一个接口里的方法doSomething,然后注册到你这里,然后我就去做别的事情去了,你在某个触发的时机回头来调用我doSomething的方法。好比,我给你打电话问某个难题,你电话里想不出来,于是说等想到了再回我电话

第一步 定义接口:

interface ContactInterface { 
	public void callBackByTel(String answer); 
}

第二步 我得先打电话(注册)到你那,告诉你我的问题是什么 所以 你那里必须有个方法 让我告诉你问题相关事宜(注册)。

public void setCallBack(String who,String question,ContactInterface callBack) {
	this.who = who;        
	System.out.println("你说:当前联系到我的人是"+who+",问题是"+question);
    this.callBack =callBack;
}
第三步  当你想到问题的答案后,打电话告诉我答案,即回调 我传进来的方法

public void handleThings(){
	//假如你现在正在想问题的答案,需要一点时间
	for(int i=0;i<100000;i++){ 
		if(i == 0){
			System.out.println("你正在思考问题.....");
		}
	}
	 
	String answer = "答案是A";
	//想到问题的办法了
	System.out.println("你说:想到答案了,准备打回去给"+who+"告诉他答案");
	callBack.callBackByTel(answer);
}


整个机制构成三要素就是: 我(客户端),你(服务端),约定(接口)

我类:

public class Me {

	public static void main(String[] args){  
		 
		Me me = new Me();
		me.hasQuestion();
		 
	}
	 
	private void hasQuestion(){
		//现在有问题想不出来答案,想去问你
		You you = new You();
		you.setCallBack("蜗牛", "某道题答案是什么?", new ContactInterface() {
			
		@Override
		public void callBackByTel(String answer) {
			System.out.println("我说:嗯,好的,我收到答案了:"+answer+",谢谢");
				
		}
	});
		//你接到电话,起床开始思考问题
		new Thread(you).start();
	}
}

你类

public class You implements Runnable{

	
	private String who;
	private ContactInterface callBack;  
	public You() {
		// TODO Auto-generated constructor stub
	}
	 
	//调用此方法就表示有人联系你了,注册到你这来
	public void setCallBack(String who,String question,ContactInterface callBack) {
		this.who = who;	
		System.out.println("你说:当前联系到我的人是"+who+",问题是"+question);
			his.callBack =callBack;
	}
	   
	public void handleThings(){
		//假如你现在正在想问题的答案,需要一点时间
		for(int i=0;i<100000;i++){  
			if(i == 0){
				System.out.println("你正在思考问题.....");
			}
		}
		 
		String answer = "答案是A";
		//想到问题的办法了
		System.out.println("你说:想到答案了,准备打回去给"+who+"告诉他答案");
		callBack.callBackByTel(answer);
	 }

	/* (non-Javadoc)
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		try {
			Thread.sleep(1000);
			handleThings();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	 
	 
}

接口

public interface ContactInterface {
	public void callBackByTel(String answer);
}

运行结果




总结起来,三个步骤如下

  • 定义接口 Callback ,包含回调方法 callback();
  • 服务端提供注册的方法,并设定在某个条件下会回调接口方法;
  • 客户端提供接口的实现方法,并注册到服务端,把方法地址传进去。


事实上我一开始说没有接触过回调函数这句话是非常不正确的,我们每天接触的Button的点击事件,就是一个很典型的回调函数


实例(对于Android界面上Button点击事件监听的模拟):

1.定义接口
public interface OnClickListener {
    public void OnClick(Button b); 
}

2. 定义Button
public class Button {
  OnClickListener listener;
 
  public void click() {
    listener.OnClick(this);
  }
  public void setOnClickListener(OnClickListener listener) {
    this.listener = listener;
  }
}

3. 将接口对象OnClickListener 赋给 Button的接口成员
public class Activity {
  public Activity() {
  }
  public static void main(String[] args) {
    Button button = new Button();
    button.setOnClickListener(new OnClickListener(){
       @Override
       public void OnClick(Button b) {
                 System.out.println("clicked");
       }   
    });
    button.click(); //user click,System call button.click();
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值