您的位置:首页 > 移动开发 > Android开发

Android 关于回调的一点总结

2016-08-13 14:36 204 查看
<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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android