Android 接口回调机制详解

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

回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

详细解释:

  客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。Web
Service以及Java的RMI都用到回调机制,可以访问远程服务器程序。

下面举个通俗的例子:

  某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。

  JAVA中不允许直接操作指针,那它的回调是如何实现的呢?

  答案:它是通过接口或者内部类来实现的。

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

  1. 定义接口 Callback ,包含回调方法 callback()

  2. 在一个类Caller 中声明一个Callback接口对象 mCallback

  3. 在程序中赋予 Caller对象的接口成员(mCallback) 一个内部类对象如

  new Callback(){

    callback(){

      //函数的具体实现

    }

  }

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

回调机制在Android框架中的使用

在Activity中定义了很多生命周期的不同状态要调用的方法,这些方法都是空实现,系统框架要调用,用户也要调用来实现。

  实例(对于Android界面上Button点击事件监听的模拟):

    a.定义接口

    public interface OnClickListener {

      public void OnClick(Button b);

    b. 定义Button

     public class Button {

      OnClickListener listener;

      public void click() {

        listener.OnClick(this);

      }

      public void setOnClickListener(OnClickListener listener) {

        this.listener = listener;

      }

     }

    c. 将接口对象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();

      }

    }

机制原理如上,那数据传递依靠接口怎么传递呢?上代码:

 /*
 * @author sunglasses
 * @category 利用xUtils框架封装get方法,IOAuthCallBack是数据接口回调,send方法里面 有异步任务方法,
 * 传统返回数据方法可能返回数据不正确。
 */
  public class xUtilsGet {

	public void getJson(String url,RequestParams params,final IOAuthCallBack iOAuthCallBack){

        HttpUtils http = new HttpUtils();
        http.configCurrentHttpCacheExpiry(1000 * 10);
        http.send(HttpMethod.GET, url, params, new RequestCallBack<String>() {

			@Override
			public void onFailure(HttpException arg0, String arg1) {
				// TODO Auto-generated method stub
			}

			@Override
			public void onSuccess(ResponseInfo<String> info) {
				// TODO Auto-generated method stub
				iOAuthCallBack.getIOAuthCallBack(info.result);
			}
		});
	}}

我用的是xUtils开发框架然后返回数据的时候用的是接口回调,接口定义如下:

  public interface IOAuthCallBack {
	public void getIOAuthCallBack(String result);
}

上层函数定义如下:

       public void getCataJson(int cityId,IOAuthCallBack iOAuthCallBack) {
		String url = "xxxxxxxxx";
		RequestParams params = new RequestParams();
                params.addQueryStringParameter("currentCityId", cityId+"");
		getJson(url,params,iOAuthCallBack);}

getcatajson是在你想得到数据的类中调用,然后传入参数和接口对象,接口对象中是要对最终数据进行处理。具体机制原理如上。这样就可以避免接口回调中的多线程数据不一致问题。

参考:http://www.cnblogs.com/vtianyun/archive/2012/06/19/2555427.html

如有问题请留言,转载注明出处。

Android 接口回调机制详解

时间: 2024-08-08 22:08:49

Android 接口回调机制详解的相关文章

Android事件分发机制详解(1)----探究View的事件分发

探究View的事件分发 在Activity中,只有一个按钮,注册一个点击事件 [java] view plaincopy button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.d("TAG", "onClick execute"); } }); 如果在需要一个触摸事件 [java] view plaincopy button.setO

Android事件分发机制详解(2)----分析ViewGruop的事件分发

首先,我们需要 知道什么是ViewGroup,它和普通的View有什么区别? ViewGroup就是一组View的集合,它包含很多子View和ViewGroup,是Android 所有布局的父类或间接父类. 但ViewGroup也是一个View,只不过比起View,它可以包含子View和定义布局参数的功能. 现在,通过一个Demo演示Android中ViewGroup的事件分发机制. 首先我们来自定义一个布局,命名为MyLayout,继承自LinearLayout,如下 所示: public c

Android事件传递机制详解及最新源码分析——ViewGroup篇

在上一篇<Android事件传递机制详解及最新源码分析--View篇>中,详细讲解了View事件的传递机制,没掌握或者掌握不扎实的小伙伴,强烈建议先阅读上一篇. 好了,废话还是少说,直奔主题,开始本篇的ViewGroup事件传递机制探索之旅. 依然从简单的Demo例子现象开始分析 新建安卓工程,首先自定义一个Button以及一个RelativeLayout,很简单,只是重写了主要与事件传递机制相关的方法,代码如下: 自定义WLButton类: 1 public class WLButton e

Android内存管理机制详解 (zhuan)

http://www.2cto.com/kf/201212/175786.html 与windows内存区别 在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这方面,区别于 Windows的内存管理.主要特点是,无论物理内存有多大,Linux都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能.而Windows是只在需要内存时,才为应用程序分配内存,

弄明白Android 接口回调机制

以前对于这个机制理解不够深刻,现在重新整理下思路. 一.建模 我理解的接口回调就是,我这个类实现了一个接口里的方法doSomething,然后注册到你这里,然后我就去做别的事情去了,你在某个触发的时机回头来调用我doSomething的方法.好比,我给你打电话问某个难题,你电话里想不出来,于是说等想到了再回我电话.于是接口回调机制比喻模型如下 第一步: 首先,你我得约定,这个实现的方法是咋样的,叫什么名字,需要传入传出什么.为什么要这样呢?你我得约定电话联系,不是微信扣扣.这就是约定的接口. 我

Android 事件分发机制详解

更多内容请参照我的个人站点: http://stackvoid.com/ 网上很多关于Android事件分发机制的解释,大多数描述的都不够清晰,没有吧来龙去脉搞清楚,本文将带你从Touch事件产生到Touch事件被消费这一全过程作全面的剖析. 产生Touch事件 这部分牵扯到硬件和Linux内核部分:我们简单讲述一下这部分内容,如果有兴趣的话可以参考这篇文章. 传递Touch事件 触摸事件是由Linux内核的一个Input子系统来管理的(InputManager),Linux子系统会在/dev/

Android事件分发机制详解:史上最全面、最易懂

前言 Android事件分发机制是每个Android开发者必须了解的基础知识 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析.简单问题复杂化等等 今天,我将全面总结Android的事件分发机制,我能保证这是市面上的最全面.最清晰.最易懂的 本文秉着"结论先行.详细分析在后"的原则,即先让大家感性认识,再通过理性分析从而理解问题: 所以,请各位读者先记住结论,再往下继续看分析: 文章较长,阅读需要较长时间,建议收藏等充足时间再进行阅读 目

Java 回调机制详解

一.说明 最近在写代码,发现 Java 回调机制蛮实用.在网上搜索部分资料以后,现在按照自己的理解进行归纳总结 ,有理解错的地方,希望大家能够帮忙指正! 先从一个很简单的 Android 开发例子说起.我们在界面上使用 Button 时,为其增加点击事件监听大概需要以下几个步骤 : ① 实例化 Button 对象,如 btn_call_back: ② btn_call_back.setOnClickListener(MainActivity.this); ③本类实现 OnClickListene

Android的事件处理机制详解(二)-----基于监听的事件处理机制

基于监听的事件处理机制 前言: 我们开发的app更多的时候是需要与用户的交互----即对用户的操作进行响应 这就涉及到了android的事件处理机制; android给我们提供了两套功能强大的处理机制: ①基于监听的事件处理机制 ②基于回调的事件处理机制 在这一节中,我们会先介绍一下基于监听的事件处理机制 好了,废话不多说! 我们要先了解一下监听处理机制的模型 监听的处理模型: 处理模型图: 文字表述: 事件监听机制中由事件源,事件,事件监听器三类对象组成 处理流程: step 1:为某个事件源