以前对于这个机制理解不够深刻,现在重新整理下思路。

一、建模

我理解的接口回调就是,我这个类实现了一个接口里的方法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=;i<;i++){
if(i == ){
System.out.println("你正在思考问题.....");
}
} String answer = "答案是A";
//想到问题的办法了
System.out.println("你说:想到答案了,准备打回去给"+who+"告诉他答案");
callBack.callBackByTel(answer);
}

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

我类——

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();
}
}

你类——

package lin.callback.test;

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);
this.callBack =callBack;
} public void handleThings(){
//假如你现在正在想问题的答案,需要一点时间
for(int i=;i<;i++){
if(i == ){
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();
handleThings();
} catch (Exception e) {
e.printStackTrace();
}
}
}

接口类——

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

验证结果:

二、总结

Java 中没有函数指针这一说,因为java没有指针,但是并不代表着它不会使用这个功能。事实上,引用就是实现了指针的功能。

回调方法就是一个通过方法指针来调用的方法。如果我将这个方法的指针(地址,引用)通过形参传递到另一个类的某个方法里,那么当这个类调用该方法里面我所传入的指针时,就能调用我这边的方法。

整个过程就是我传入方法A的地址,你接收,并在某个时刻回调我这边的A方法。

由于java没办法操作指针,于是它用接口来实现。

JAVA方法回调是一种耦合设计思想。作为一种架构,必须有自己的运行环境,并且提供用户的实现接口。

主要步骤如下:

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

    这样,在需要的时候,可用Caller对象的mCallback接口成员调用callback()方法,完成回调了。

    三、Android中的回调机制

    在android 中回调机制被大量使用。

    比如,在Activity中定义了很多生命周期的不同状态要调用的方法,这些方法都是空实现,系统框架要调用,用户也要调用来实现。或者更直接的是按键点击的实现方法。

loginButton.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
    // TODO Auto-generated method stub
  }
});

明显,OnClickListener就是android 系统所约定好的接口,然后我们写的应用程序就是客户端,android 系统就是服务端。模型关系如下图所示:

以上可以看出,接口(系统框架)是系统提供的,接口的实现是用户实现的,这样可以达到接口统一,实现不同的效果。

系统在不同的状态“回调”我们的实现类,来达到接口和实现的分类。

弄明白Android 接口回调机制的更多相关文章

  1. Android接口回调机制

    开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 举个例子: A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A ...

  2. 关于android接口回调机制

    http://www.cnblogs.com/JohnTsai/p/3975022.html http://www.zhihu.com/question/19801131 In my previous ...

  3. (转)Android之接口回调机制

    开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 举个例子: A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A ...

  4. Java接口回调机制

    一.前言 最近在看android Fragment与Activity进行数据传递的部分,看到了接口回调的内容,今天来总结一下. 二.回调的含义和用途 1.什么是回调? 一般来说,模块之间都存在一定的调 ...

  5. JAVA和Android的回调机制

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢 以 前不理解什么叫回 ...

  6. Android接口回调的理解

    1.各种理解 <1>说白了,就是拿到对象引用,调其方法 <2>实际上就是利用多态的方式调用而已 <3>其实很容易理解的,定义接口,然后提供一个外部的接口设置进去,然 ...

  7. 模拟DbUtils实现接口回调机制

    想必大家都用过apache 的DbUtils吧,这个简单的对JDBC的封装小框架真的是非常非常的适合新手的学习呢.逻辑上也不是很复杂,难度刚刚好. 下面我就模仿它来实现一个字符串的处理小框架. 思路 ...

  8. Android事件分发机制(二)30分钟弄明白Touch事件分发机制

    Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...

  9. Android:30分钟弄明白Touch事件分发机制

    Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...

随机推荐

  1. VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结

    转帖:http://blog.csdn.net/whygosofar/article/details/2821875 MSDN中对于在不同的配置下Link的LIB作了说明: C Runtime Lib ...

  2. find详解

    一.简介 在目录结构中搜索文件,并执行指定的操作. 二.语法 find path -option [ -print ] [ -exec -ok command ] {} \;path: find命令所 ...

  3. 【转】Linux下tar.xz结尾的文件的解压方法--不错

    原文网址:http://blog.csdn.net/silvervi/article/details/6325698 今天尝试编译内核,下载到了一份tar.xz结尾的压缩文件,网上解决方法比较少,不过 ...

  4. 什么是野指针?(What is a wild pointer?)

    未被初始化的变量称为野指针(wild pointer).顾名思义,我们不知道这个指针指向内存中的什么地址,使用不当程序会产生各种各样的问题. 理解下面的例子: int main() { int *p; ...

  5. 浅谈JS数据类型存储问题

    背景       一个经典的问题,先抛出来给大伙看看: var a = "黑MAO"; var b = a; var c = new Object(); var d = c; a ...

  6. linux文件权限整理

    网上对linux文件权限的已经很多,不过还是要自己整理一下,不然每次都要查资料. linux下所有东西都是文件,包括设备,所以这里的文件也包括文件夹. 先是查看文件权限:ls -lh xzc@xzc- ...

  7. 基于google earth engine 云计算平台的全国水体变化研究

    第一个博客密码忘记了,今天才来开通第二个博客,时间已经过去两年了,三年的硕士生涯,真的是感慨良多,最有收获的一段时光,莫过于在实验室一个人敲着代码了,研三来得到中科院深圳先进院,在这里开始了新的研究生 ...

  8. Oracle—RMAN备份(二)

    在Oracle  RMAN备份(一)中,对各种文件在RMAN中备份进行了说明, 一.备份集的复制 在RMAN 备份中,可以备份其自己的备份,即备份一个文件放在多个目录下,oralce支持最多备份四个. ...

  9. iOS多线程及其感悟

    感觉每天都是匆匆忙忙的,每天似乎都是时间不够用一样,可是等真的想要动手敲代码的时候才发现,原来还有好多好多的知识点不是太熟练,所以,人不可以一直感觉自我良好, 有时间就是那种自我感觉良好的心态毁了自己 ...

  10. Js获取Gridview中Dropdownlist选中状态

    在Gridview中加入Dropdownlist模板列,加入DropDownlist 是一种常用的操作,其中涉及到如何获取选择项和Gridview重新绑定两个要点. 如图 前台代码如下 <%@ ...