深入理解Android之接口回调机制_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,谢谢

对回调的深入思考:

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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android回调机制
android接口回调机制、安卓接口回调机制、接口回调机制、回调函数 太深入、android回调机制,以便于您获取更多的相关知识。

时间: 2024-10-23 06:08:40

深入理解Android之接口回调机制_Android的相关文章

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

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

深入浅析Android接口回调机制

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

android java 回调-关于android中的回调机制 求大神帮忙看看代码

问题描述 关于android中的回调机制 求大神帮忙看看代码 boss 叫我写一个sdk 然后里面得实现回调 还给了我个demo 说回调机制和这个demo 一样 大概就是从A客户端发出一个数据 然后我这边接受 接受和执行一个事件 然后再回调给C public class DemoActivity extends Activity { private InputInterceptor input; @Override protected void onCreate(Bundle savedInst

Android深入浅出之Binder机制_Android

Android深入浅出之Binder机制 一 说明  Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的.所以搞明白Binder的话,在很大程度上就能理解程序运行的流程. 我们这里将以MediaService的例子来分析Binder的使用:          ServiceManager,这是Android OS的整个服务的管理程序         MediaService,这个程序里边注册了提供媒体播放的服务程

Android中Handler消息传递机制_Android

Handler 是用来干什么的? 1)执行计划任务,可以在预定的时间执行某些任务,可以模拟定时器 2)线程间通信.在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息.当你创建子线程时,你可以在你的子线程中拿到父线程中创建的Handler 对象,就可以通过该对象向父线程的消息队列发送消息了.由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面. 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发

理解Java当中的回调机制

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

深入理解Android中的建造者模式_Android

前言 在Android开发过程中,我发现很多安卓源代码里应用了设计模式,比较常用的有适配器模式(各种adapter),建造者模式(Alert Dialog的构建)等等.虽然我们对大多数设计模式都有所了解,但是在应用设计模式的这个方面,感觉很多人在这方面有所不足.所以这篇文章我们一起深入的理解Android中的建造者模式. 建造者模式(Builder Pattern)也叫生成器模式,其定义如下: separate the construction of a complex object from

模拟DbUtils实现接口回调机制

想必大家都用过apache 的DbUtils吧,这个简单的对JDBC的封装小框架真的是非常非常的适合新手的学习呢.逻辑上也不是很复杂,难度刚刚好. 下面我就模仿它来实现一个字符串的处理小框架. 思路 我的思路是这样的,根据DbUtils中的实现方式,来进行模拟处理. 示例分析 @Test public void insert() throws Exception { Connection conn = ConnTools.getConnection(); QueryRunner runner =

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

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