博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
弄明白Android 接口回调机制
阅读量:5266 次
发布时间:2019-06-14

本文共 3547 字,大约阅读时间需要 11 分钟。

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

一、建模

我理解的接口回调就是,我这个类实现了一个接口里的方法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); }

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

验证结果:

\

二、总结

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

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

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

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

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

主要步骤如下:

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

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

    三、中的回调机制

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

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

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

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

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

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

转载于:https://www.cnblogs.com/zhujiabin/p/5473115.html

你可能感兴趣的文章
jstl-c:forEach
查看>>
Android----ListView入门知识--各种Adapter配合使用
查看>>
Swift 02.Array
查看>>
【arc093f】Dark Horse(容斥原理,动态规划,状态压缩)
查看>>
数据生成XML导入Excel
查看>>
MVC返回400 /404/...
查看>>
第二次作业
查看>>
浏览Document文件夹下面的所有文件夹和文件列表
查看>>
POJ3096:Surprising Strings(map)
查看>>
Linux命令行–基本的bash shell命令
查看>>
HDU4268(贪心+multiset)
查看>>
Problem I. Count - HDU - 6434(欧拉函数)
查看>>
angularjs 点击事件与动态追加
查看>>
如何在ScrollView中嵌套ListView
查看>>
委托和事件的简单实用
查看>>
面试题答案一
查看>>
arcgis 10.3 属性表乱码解决方案
查看>>
[转] Word2vec数学原理全家桶
查看>>
转:ArcGIS10.1正式版安装与破解
查看>>
国内代码托管
查看>>