深入理解Android之接口回调机制

刚开始学对于这个机制理解不够深刻,现在重新整理下思路。开发中,接口回调是我们经常用到的。

接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行。

首先解决啥是回调:

举个例子:某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。

C不会自己调用b,C提供b的目的就是让S来调用它,而且C不得不提供。S并不知道C提供的b是什么,因此S会约定b的接口规范(函数原型),然后由C提前通过S的一个函数r告诉S自己将要使用b函数(即注册)。r为注册函数。

简单来说:回调函数就是预留给系统调用的函数,而且我们往往知道该函数被调用的时机,那我们继续完善下上面的那幅图。

看着这幅图,其实我们回想一下,会发现,生活中到处都有回调这种思想存在。软件的很多思想其实只是我们实际生活中思维方式的一种转化。

我们平时考试答题的第一件事是干嘛?没错,是写上学号和姓名。这里注意了,我们填写学号和姓名不是给自己看的(即该方法不是给自己调用的),而是给老师登记分数时看的(预留给系统将来调用),这其实就是一个回调的应用。老师提供接口(输入姓名,学号规则),我们利用接口注册。

看到上面的小示例,大家对回调就有了一些了解了,我们再回到文章刚开始的例子。

那个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。

我们已经大概知道了回调的基本流程,下面,来看看Android中回调的基本使用。

场景一:

Button button = (Button)this.findViewById(R.id.button);
button.setOnClickListener(newButton.OnClickListener() {
  //回调函数
  @override
  publicvoidonClick(View v) {
   buttonTextView.setText("按钮被点击了");
  }
});

上面的代码给按钮加了一个事件监听器,这其实就是“回调”最常见的应用场景之一。我们自己不会显式地去调用onClick方法。用户触发了该按钮的点击事件后,它会由Android系统来自动调用。

场景二:

@Override
publicvoidonCreate(BundlesaveInstanceState) {
  super.onCreate(saveInstanceState);
  // You code...
}
@Override
publicvoidonResume() {
  super.onResume();
  // You code...
}

Activity的整个生命周期基本上都说回调函数在发挥作用。

看了两个我们经常使用的回调方式,我们先来总结下android利用回调的基本方法。其实,只是把我们的那张图翻译了下。

--你类--

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 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 interface ContactInterface { 

  public void callBackByTel(String answer); 

}

验证结果:

你说:当前联系到我的人是蜗牛,问题是某道题答案是什么?
你正在思考问题
你说:想到问题了,准备打回去给蜗牛告诉他答案
我说:嗯,好的,我收到答案了:答案是A,谢谢

对回调的深入思考:

程序的本质就是代码跳转,不管同步异步反射接口虚函数,本质上都是函数调用。函数我们要调用它,就需要它的指针,不同语言通过不同的方式来得到这个指针。而我们定义的接口其实就是一个函数指针,那么那个注册过程,其实就是相当于对那个函数指针赋值。通过这个函数指针来调用我们定义的自实现函数。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 接口对象的实例化在接口回调中的使用方法

    首先澄清一个问题,就是接口不仅可以声明对象,而且可以把对象实例化!作用见下文. 接口回调:可以把实现某一接口类创建的对象的引用赋给该接口声明的接口变量,那么该 接口变量就可以调用被类实现的接口中的方法.实际上,当接口变量调用被类实现的接口 中的方法时,就是通知相应的对象调用接口方法. 我们看下面的例子: interface Computerable { public double area(); } class Rec implements Computerable { double a,b;

  • Android中回调接口的使用介绍

    MainActivity如下: 复制代码 代码如下: package cn.testcallback; import android.os.Bundle; import android.widget.Toast; import android.app.Activity; /** * Demo描述: * Android中回调接口的使用 */ public class MainActivity extends Activity { @Override protected void onCreate(

  • 详解Android中接口回调、方法回调

    在Android开发中我们很多地方都用到了方法的回调,回调就是把方法的定义和功能导入实现分开的一种机制,目的是为了解耦他的本质是基于观察者设计模式,即观察者设计模式的的简化版,例如:在下载时候的进度回调,在adapter与activity之间的回调,在javabean和fragment以及fragment之间的回调等等,回调的目的主要有两个:其一是传递数据,其二是保持数据的同步更新.常用的有两种形式,一是使用内部类的形式,得到接口的子类对象,另一种是直接实现定义的接口. 一.内部类的形式 1.在

  • 深入理解Android之接口回调机制

    刚开始学对于这个机制理解不够深刻,现在重新整理下思路.开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 首先解决啥是回调: 举个例子:某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了.过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理. C不会自己调用b,C提供b的目的就是让S来调用它,而且C不得不提供.S并

  • 深入浅析Android接口回调机制

    在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程或者是异步任务去做的,这就会导致我们期望函数回调完毕去返回一个主函数的结果,实际发现是行不通的,因为如果回调是多线程的话你是无法和主函数同步的,也就是返回的数据是错误的,这是非常隐秘的一个错误.那有什么好的方法去实现数据的线性传递呢?先介绍下回调机制原理. 回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数

  • 理解Java当中的回调机制(翻译)

    你好,今天我要和大家分享一些东西,举例来说这个在JavaScript中用的很多.我要讲讲回调(callbacks).你知道什么时候用,怎么用这个吗?你真的理解了它在java环境中的用法了吗?当我也问我自己这些问题,这也是我开始研究这些的原因.这个背后的思想是控制反转( PS:维基百科的解释是控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.)这个范例描述了框架(framework)的工作方式,也以"好莱坞原则:

  • 深入了解Java接口回调机制

    一.前言 最近在看android fragment与Activity进行数据传递的部分,看到了接口回调的内容,今天来总结一下. 二.回调的含义和用途 1.什么是回调? 一般来说,模块之间都存在一定的调用关系,从调用方式上看,可以分为三类同步调用.异步调用和回调.同步调用是一种阻塞式调用,即在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行.异步调用是一种类似消息或事件的机制解决了同步阻塞的问题,例如 A通知 B后,他们各走各的路,互不影响,不用像同步调用那样, A

  • 深入理解Android组件间通信机制对面向对象特性的影响详解

    组件的特点对于Android的四大组件Activity, Service, ContentProvider和Service,不能有Setter和Getter,也不能给组件添加接口.原因是组件都是给系统框架调用的,开发者只能实现其规定的回调接口,组件的创建与销毁都是由系统框架控制的,开发者不能强行干预,更没有办法获取组件的对象.比如Activity,Service,BroadcastReceiver,你没有办法去创建一个Activity,Service或BroadcastReceiver,然后像使

  • java回调机制实例详解

    java回调机制实例详解 以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式: Class A实现接口CallBack callback--背景1 class A中包含一个class B的引用b --背景2 clas

  • Android View事件分发机制详解

    准备了一阵子,一直想写一篇事件分发的文章总结一下,这个知识点实在是太重要了. 一个应用的布局是丰富的,有TextView,ImageView,Button等,这些子View的外层还有ViewGroup,如RelativeLayout,LinearLayout.作为一个开发者,我们会思考,当点击一个按钮,Android系统是怎样确定我点的就是按钮而不是TextView的?然后还正确的响应了按钮的点击事件.内部经过了一系列什么过程呢? 先铺垫一些知识能更加清晰的理解事件分发机制: 1. 通过setC

  • Java 异步回调机制实例分析

    Java 异步回调机制 一.什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用. 回调是一种特殊的调用,至于三种方式也有点不同. 1.同步回调,即阻塞,单向. 2.回调,即双向(类似自行车的两个齿轮). 3.异步调用,即通过异步消息进行通知. 二.CS中的异步回调(Java案例) 比如这里模拟个场景:客户端发送msg给服务端,服务端处理后(5秒),回调给客户端

  • 理解Android系统Binder机制

    一.Binder机制概述 在Android开发中,很多时候我们需要用到进程间通信,所谓进程间通信,实现进程间通信的机制有很多种,比如说socket.pipe等,Android中进程间通信的方式主要有三种: 1.标准Linux Kernel IPC 接口: 2.标准D-BUS接口: 3.Binder接口. 其中,Binder机制是使用最且最被认可的,因为Binder机制有以下优点: 1.相对于其它IPC机制,Binder机制更加简洁和快速: 2.消耗的内存相对更少: 3.传统的IPC机制可能会增加

随机推荐