浅析android系统设计中的回调思想

为何写作本文

??在慢慢深入接触android开发的过程中,我越来越发现android中(至少应用曾的开发)用到了很多回调的思想。比如activity的生命周期,fragment的生命周期,皆是回调函数实现的,android中的事件处理机制其一就是回调,线程方面的异步任务、loader、hanlder等都是基于回调的,等等。

??可见android的其一根本思想就是回调,需要你来参与时,回调用相关的回调方法,你来填充。

??可以说回调的思想浸润与android设计的方方面面,android开发中几乎带有on的方法都是回调方法。作为一名致力于深入学习移动开发的菜鸟,深入理解回调就显得非常必要了。

为何要引入回调

??回调是不得以而为之的设计策略,想象一种系统实现:在一个下载系统中有一个文件下载模块和一个下载文件当前进度显示模块,系统要求实时的显示文件的下载进度,想想很简单,在面向对象的世界里无非是实现两个类而已。但是问题恰恰出在这里,显示模块如何驱动下载进度条?显示模块不知道也不应该知道下载模块所知道的文件下载进度(面向对象设计的封装性,模块间要解耦,模块内要内聚),文件下载进度是只有下载模块才知道的事情,解决方案很简单给下载模块传递一个函数指针作为回调函数驱动显示模块的显示进度。

??在面向对象的世界中这样的例子还真不少,造成这样的问题的根源,相信大家已经从上面的叙述中体会到了,就是面向对象的程序设计思想,就是设计模式中要求的模块独立性,高内聚低耦合等特性。

??封装变化的编程策略给编程人员第一位的指导思想就是面向接口编程,即设计模式中提到的面向虚拟编程而不是面向实现。这样的编程思想极大地革新了编程世界,可以说没有这一原则就没有面向对象的程序设计,这一原则给程序设计一种指导思想:即如何更高的将现实模型映射成程序模型。这样的设计思想在极大地催生高度独立性模块的同时削弱了模块间的协作性,也就是耦合性,它使得模块间更多的从事着单向的调用工作,一个模块需要某种服务就去找另一个模块,这使得程序呈现出层次性,高层通过接口调用底层,底层提供服务。但是现实世界中严格遵循现层次特性的系统是很少见的,绝对的MVC是不存在的,因为更多的模块要求通并协作,可见没有耦合就没有协作没有好的调用关系,耦合真的不是错。

??既然我们需要模块间的协作,同时我们又厌恶的摒弃模块间你中有我我中有你的暧昧关系那如何生成系统呢,答案是函数指针(不一定是函数指针)也就是使用回调的方式。如果一个对象关心另一个对象的状态变化那么给状态的变化注册回调函数让它通知你这类状态的改变,这样在封装了模块变化的同时实现了模块间的协作关系另辟独径的给对象解耦。

回调的通俗理解

??你饿了,想吃饭,就一会去问你妈一声”开饭没有啊?”这就是正常函数调用.

??但是今天你妈包饺子,花的时间比较长,你跑啊跑啊,就烦了.于是你给你妈说,我先出去玩会,开饭的时候打我手机.等过了一阵,你妈给你打电话说”开饭啦,快回来吃饭吧!”

??其中,你告诉你妈打手机找你,就是个你把回调函数句柄保存到你妈的动作.你妈打电话叫你,就是个回调过程.

回调的详细解释

理解方式1:一般写程序是你调用系统的API,这个过程叫Call。如果把关系反过来,你写一个函数,让系统调用你的函数,那就是回调(CallBack)了,那个被系统调用的函数就是回调函数。放到android中,我们一般是调用framwork定义的api,但是如果我们写了一个方法,由framwork来调用,这个方法就是回调函数。

理解方式2:所谓回调函数,其运行方式是,“你不用调用我,等着我来调用你”。回调的意思是在你执行某个语句后成功了,再执行你传递进来的function,在做异步处理的时候特别有用。

理解方式3:归程序本质,刨除那些面向对象的概念,回调函数就是一个通过函数指针调用的函数。就是用函数指针做参数。那个函数指针就是回调函数。

??回调是编程层面的设计模式,不是基于语言的。在C/C++中,要用回调函数,被调函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数。在.Net的世界里Delegate ==Callback。

在android中怎么使用回调呢

JAVA的CALLBACK通过接口来实现。

例:

1.class A,class B

2.class A实现接口operate

3.class B拥有一个参数为operate接口类型的函数test(operate o)

4.class A运行时调用class B中test函数,以自身传入参数

5.class B已取得A,就可以随时回调A所实现的operate接口中的方法

使用案例

自己以以前写的一篇博客为案例做以分析:

http://blog.csdn.net/a910626/article/details/45767079

回调图示:

回调用在哪里

  1. 回调函数主要用于一些比较费时的操作,或响应不知道何时将会发生的事件,场合异步结合(异步其实就是重开一个线程)。
  2. 当两个对象之间需要进行一些协同操作时,常使用回调函数,比如一个对象想获得另一个对象内部的某些数据。

回调的优点

回调函数使得程序设计更加灵活。

实现模块独立性,将实现者和调用者分离,符合面对对象高内聚低耦合的设计思想。

回调的缺点

代码的易读性不好。

时间: 2024-10-14 23:11:33

浅析android系统设计中的回调思想的相关文章

讨论Android开发中的MVC设计思想

最近闲着没事,总是想想做点什么.在时间空余之时给大家说说MVC设计思想在Android开发中的运用吧! MVC设计思想在Android开发中一直都是一套比较好的设计思想.很多APP的设计都是使用这套方案完成架构设计的. 谈到MVC我想分为以下几个点分点突进. 1.什么是MVC框架. 2.MVC如何工作 3.MVC的缺点 4.Android之MVC设计模式. 一.什么是MVC框架. MVC英文即Model-View-Controller,即把一个应用的输入.处理.输出流程按照Model.View.

Android中关于回调概念的笔记

一.回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应. 详细解释: 客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数.例如Win32下的窗口过程函数就是一个典型的回调函数.一般说来,C不会自己调用B,C提

从源码中浅析Android中如何利用attrs和styles定义控件

一直有个问题就是,Android中是如何通过布局文件,就能实现控件效果的不同呢?比如在布局文件中,我设置了一个TextView,给它设置了textColor,它就能够改变这个TextView的文本的颜色.这是如何做到的呢?我们分3个部分来看这个问题1.attrs.xml  2.styles.xml  3.看组件的源码. 1.attrs.xml: 我们知道Android的源码中有attrs.xml这个文件,这个文件实际上定义了所有的控件的属性,就是我们在布局文件中设置的各类属性 你可以找到attr

[Android] AS 中 Gradle 配置运行浅析

======================================================== 作者:qiujuer 博客:blog.csdn.net/qiujuer 网站:www.qiujuer.net 开源库:Genius-Android 转载请注明出处:http://blog.csdn.net/qiujuer/article/details/42342667 ========================================================

Android中自定义veiw使用Java中的回调方法

//------------------MainActivity----中---------------------------------- import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.widget.Toast; public class MainActivity extends Activity { p

Android编译系统中的Kconfig,Makefile,.config编译系统浅析

在对Android进行编译时,用的就是Linux下的Makefile和Kconfig编译系统,对整个系统进行编译.当然还包括很多配置命令,比如make defconfig, make oldconfig以及各种编译的脚本,共同构成Android的整个编译系统! 跟make menuconfig这个命令相关的文件,包括三类,包括.config,Kconfig,Makefile.为什么不说三个,而说三类呢?因为 Kconfig和Makefile是配合使用的,在很多的子目录都存在,而.config只存

浅析Android中的消息机制

Android系统中的视图组件并不是线程安全的,如果要更新视图,必须在主线程中更新,不可以在子线程中执行更新的操作. Android系统中的Looper负责管理线程的消息队列和消息循环.通过Looper.myLooper()得到当前线程的Looper对象,通过Looper.getMainLooper()得到当前进程的主线程的Looper对象. Android的消息队列和消息循环都是针对具体线程的,一个线程可以存在一个消息队列和消息循环,特定线程的消息只能分发给本线程,不能跨线程和跨进程通讯. H

浅析Android中ndk-build支持的参数

在解决Android Studio中编译native code出现的问题时,发现Android Studio使用了完整的ndk-build命令进行编译,参数众多.故在此做一个说明,以便大家可以根据偏好自行设定参数. ndk-build编译支持的参数: NDK_PROJECT_PATH 一般为null APP_BUILD_SCRIPT=…. Android.mk文件de路径 APP_PLATFORM=android-xx 编译模块所使用的api level,一般不用设置,但在Android Stu

浅析Android中的消息机制(转)

原博客地址:http://blog.csdn.net/liuhe688/article/details/6407225 在分析Android消息机制之前,我们先来看一段代码: 1 public class MainActivity extends Activity implements View.OnClickListener { 2 private TextView stateText; 3 private Button btn; 4 5 @Override 6 public void onC