Android实际开发常用框架总结

一、进行网络请求的常用框架及其用法
1、OKHTTP的实际开发中的用法
2、Volley的实际开发中的用法

二、实际开发中进行图片下载以及缓存的框架
1、神奇的Picasso 框架
2、Android Universal Image Loader
3、Glide最火图片加载开源框架加载Gif资源图到Android ImageView中
4、Fresco让图片的渐进式呈现的强大框架
5、Picasso, ImageLoader, Fresco, Glide优劣

三、实际开发中对View对象注入以及事件绑定的框架
1、ButterKnife(黄油刀)的用法
2、Dagger的用法

四、2016年实际开发进行JSON解析的最火框架
1、FastJson最全面的Json解析框架
2、Gson一句代码搞定Json的解析

五、发布 / 订阅的事件总线
(一) Otto与EventBus
1、Bus实例化
2、注册和解绑Bus
3、消息的发布
4、消息的订阅
5、消息的produce

2016年Android实际开发常用框架总结
一、进行网络请求的常用框架及其用法
1、OKHTTP的实际开发中的用法
Android系统提供了两种HTTP通讯类HttpURLConnection和HttpClient,Android6.0后,HttpClient就被google公司给废弃了。尽管Google在大部分安卓版本中推荐使用HttpURLConnectin,但是这个类相比HttpClient实在是太难用,太弱爆了。
OkHttp是一个相对成熟的解决方案,据说Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了。所以我们更有理由相信OkHttp的强大。
使用范围:OkHttp支持Android2.3及其以上版本。对于Java,JDK1.7以上。
基本使用(GET请求):

总结:Request是OkHttp中访问的请求,Builder是辅助类,Response就是OkHttp的响应。

POST提交键值对请求:
很多时候我们会需要通过POST方式把键值对数据传送到服务器。OkHttp提供了很多方便的方式来做这件事情。

总结:通过上面的例子我们可以发现,OkHttp在很多时候使用都是很方便的,而且很多代码也有重复,因此特地整理了下面的工具类。 注意:
1、OkHttp官方文档并不建议我们创建多个OkHttpClient,因此全局使用一个。 如果有需要,可以使用clone方法,再进行自定义。
2、enqueue为OkHttp提供的异步方法。
OkHttpUtil类当中的方法:
① 不会开启异步线程方法:
public static Response execute(Request request);
② 开启异步线程访问网络:
public static void enqueue(Request request, Callback responseCallback);
③ 开启异步线程访问网络,且不在意返回结果(实现空callback):
public static void enqueue(Request request);
④ 使用了HttpClient的API,只是为了方便:
Public static String formatParams(Listparams);
⑤ 为HttpGet的Url方便的添加多个name和Value参数:
Public static StringattachHttpGetParams(Stringurl,List params);
⑥ 位HttpGet的url方便的添加一个name和value参数:
Public static String attachHttpGetParam(String url, String name, String value);

2、Volley的实际开发中的用法
Volley常见用法介绍
    我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。
不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。
    Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
    下图所示的这些应用都是属于数据量不大,但网络通信频繁的,因此非常适合使用Volley。

(1)下载Volley
介绍了这么多理论的东西,下面我们就准备开始进行实战了,首先需要将Volley的jar包准备好,如果你的电脑上装有Git,可以使用如下命令下载Volley的源码:
git clone https://android.googlesource.com/platform/frameworks/volley
下载完成后将它导入到你的Eclipse工程里,然后再导出一个jar包就可以了。如果你的电脑上没有Git,那么也可以直接使用我导出好的jar包,下载地址是:http://www.kwstu.com/ResourcesView/kwstu_201441183330928
新建一个Android项目,将volley.jar文件复制到libs目录下,这样准备工作就算是做好了。

(2)StringRequest的用法
    前面已经说过,Volley的用法非常简单,那么我们就从最基本的HTTP通信开始学习吧,即发起一条HTTP请求,然后接收HTTP响应。首先需要获取到一个RequestQueue对象,可以调用如下方法获取到:
RequestQueue mQueue = Volley.newRequestQueue(context);
注意这里拿到的RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,基本上在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。
    接下来为了要发出一条HTTP请求,我们还需要创建一个StringRequest对象,如下所示:

可以看到,这里new出了一个StringRequest对象,StringRequest的构造函数需要传入三个参数,第一个参数就是目标服务器的URL地址,第二个参数是服务器响应成功的回调,第三个参数是服务器响应失败的回调。其中,目标服务器地址我们填写的是百度的首页,然后在响应成功的回调里打印出服务器返回的内容,在响应失败的回调里打印出失败的详细信息。
    最后,将这个StringRequest对象添加到RequestQueue里面就可以了,如下所示:
mQueue.add(stringRequest);
    另外,由于Volley是要访问网络的,因此不要忘记在你的AndroidManifest.xml中添加如下权限:
< uses-permission android:name=”android.permission.INTERNET” />
好了,就是这么简单,如果你现在运行一下程序,并发出这样一条HTTP请求,就会看到LogCat中会打印出如下图所示的数据。

    没错,百度返回给我们的就是这样一长串的HTML代码,虽然我们看起来会有些吃力,但是浏览器却可以轻松地对这段HTML代码进行解析,然后将百度的首页展现出来。这样的话,一个最基本的HTTP发送与响应的功能就完成了。你会发现根本还没写几行代码就轻易实现了这个功能,主要就是进行了以下三步操作:
1. 创建一个RequestQueue对象。
2. 创建一个StringRequest对象。
3. 将StringRequest对象添加到RequestQueue里面。
    不过大家都知道,HTTP的请求类型通常有两种,GET和POST,刚才我们使用的明显是一个GET请求,那么如果想要发出一条POST请求应该怎么做呢?StringRequest中还提供了另外一种四个参数的构造函数,其中第一个参数就是指定请求类型的,我们可以使用如下方式进行指定:
[java] view plaincopy
StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener);
可是这只是指定了HTTP请求方式是POST,那么我们要提交给服务器的参数又该怎么设置呢?很遗憾,StringRequest中并没有提供设置POST参数的方法,但是当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数,那么解决方法自然也就有了,我们只需要在StringRequest的匿名类中重写getParams()方法,在这里设置POST参数就可以了,代码如下所示:

    你可能会说,每次都这样用起来岂不是很累?连个设置POST参数的方法都没有。但是不要忘记,Volley是开源的,只要你愿意,你可以自由地在里面添加和修改任何的方法,轻松就能定制出一个属于你自己的Volley版本。

(3)JsonRequest的用法
    学完了最基本的StringRequest的用法,我们再来进阶学习一下JsonRequest的用法。类似于StringRequest,JsonRequest也是继承自Request类的,不过由于JsonRequest是一个抽象类,因此我们无法直接创建它的实例,那么只能从它的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,从名字上你应该能就看出它们的区别了吧?一个是用于请求一段JSON数据的,一个是用于请求一段JSON数组的。至于它们的用法也基本上没有什么特殊之处,先new出一个JsonObjectRequest对象,如下所示:

    可以看到,这里我们填写的URL地址是http://m.weather.com.cn/data/101010100.html,这是中国天气网提供的一个查询天气信息的接口,响应的数据就是以JSON格式返回的,然后我们在onResponse()方法中将返回的数据打印出来。
    最后再将这个JsonObjectRequest对象添加到RequestQueue里就可以了,如下所示:
mQueue.add(jsonObjectRequest);
这样当HTTP通信完成之后,服务器响应的天气信息就会回调到onResponse()方法中,并打印出来。现在运行一下程序,发出这样一条HTTP请求,就会看到LogCat中会打印出如下图所示的数据。

    由此可以看出,服务器返回给我们的数据确实是JSON格式的,并且onResponse()方法中携带的参数也正是一个JSONObject对象,之后只需要从JSONObject对象取出我们想要得到的那部分数据就可以了。
    你应该发现了吧,JsonObjectRequest的用法和StringRequest的用法基本上是完全一样的,Volley的易用之处也在这里体现出来了,会了一种就可以让你举一反三,因此关于JsonArrayRequest的用法相信已经不需要我再去讲解了吧。

(4)Volley的优缺点
优点: Volley的优点在于请求队列的管理, 适合小而频繁的请求, 如果app比较小, 网络请求要求不高的情况下可以使用volley, 通常情况下是要结合其他框架一起来使用, 比如volley+okhttp.

缺点: 下载大文件性能不佳, 不支持大文件上传

二、实际开发中进行图片下载以及缓存的框架
1、神奇的Picasso 框架
    在Android中开发,常需要从远程获取图片并显示在客户端,当然我们可以使用原生HttpURLConnection和AsyncTask等操作来完成,但并不推荐,因为这样不仅需要我们编写大量的代码, 还需要处理缓存和下载管理等,最好自己封装成库或者采用第三方库;
使用HttpUrlConnection和AsyncTask实现远程图片下载:
使用HttpUrlConnection和AsyncTask获取远程图片,需要以下几步:
1、HttpUrlConnection connection = url.openConnection();
2、InputStream in = connection.getInputStream();
3、Bitmap bitmap = BitmapFactory.decodeStream(in);
4、imageView.setBitmap(bitmap);
我们知道在主线程中是无法执行联网操作的,所以需要AsyncTask,将耗时操作运行在后台线程中。

Picasso的基本使用:
将Picasso添加进项目后,要使用它非常简单,只需要一行代码就能搞定:
Picasso.with(context).load(imageUrl).into(imageView);
1、自动将图像缓存在本地;
2、通过图片压缩转换以减少内存消耗;
3、自动处理了ImageView的回收,即自动取消不在视野范围内的ImageView视图资源的加载;
适配器:
适配器自动发现和重用以前取消的下载:

图像格式转换:
很多时候需要将图片进行格式转换或者剪切以节省内存或者达到我么的布局效果:
裁剪大小方法:Picasso.with(context).load(imageUrl).resize(50, 50).centerCrop().info(imageView);
自定义格式转换:
为了实现更多你想要图片转换的效果,你可以自己实现一个实现了Transformation接口的类,然后将其对象传递给transform()方法:

占位符图片:
所谓的占位符图像即当图片未正常显示时默认的图片,通过placeholder()设置,Picasso也支持设置图片显示错误时显示的默认图片,通过error()设Picasso.with(context).load(imageUrl).placeholder(R.drawable.image_placeholder).error(R.drawable.image_error_placeholder).into(imageView);
载入本地资源:
除了通过网络下载图片,Picasso也可以载入本地图片资源:
Picasso.with(context).load(R.drawable.icon).into(imageView);
Picasso.with(context).load(“file:///android_asset/Android.png”).into(imageView);
Picasso.with(context).load(new File(…)).into(imageView);

调试:
为了方便调试,你可以通过调试Picasso的setIndicatiorEnabled(true);可以让不同来源的图片显示一个不同的色彩标记

2、Android Universal Image Loader
    实际项目开发中ImageLoader的使用率非常的高,用法多样性很大,由于篇幅问题,详情请猛戳下面链接:
http://note.youdao.com/share/?id=7601c6850df29dea288734677fd5a56c&type=note

3、Glide最火图片加载开源框架加载Gif资源图到Android ImageView中
    通常Android的ImageView不能加载Gif图片,如不做任何处理,那么加载到ImageView中的Gif只显示第一帧。网上给出很多解决方案,也有不少开源框架定制专属的Gif View用于加载Gif图,这些解决方案基本上大多数是借助Android的Movie,把Gif图片资源作为流,解析成Android Movie显示,这些定制的基本思想就是先检测该图片资源是否是Gif图,若是,则按照Android Movie解析之。
    有一个Android Glide开源框架,本身在图片加载和缓存方面做的比较优秀,我之前已写了一篇文章专门介绍如何在自己的项目中具体使用Android Glide库(该文章的链接地址:http://blog.csdn.net/zhangphil/article/details/45535693 ),同时,Android Glide加载Gif图片也很方便,把需要加载的gif图放到drawable目录下,然后就和普通的Andriod ImageView设置一个图片资源R.drawanle.xxx一模一样,很简单。或者从网路URL加载一个图片,开发者不用关心这个图片资源是否是gif还是其他jpg还是png等等格式,直接将其当作一个普通的图片加载之即可,至于该图片资源格式的判断处理及绘制,则有Android Glide全部代劳。
现举例:

其中,R.drawable.loading是加载了drawable目录下的loading.gif图:

4、Fresco让图片的渐进式呈现的强大框架
    Fresco 是一个强大的图片加载组件。Fresco 中设计有一个叫做 image pipeline 的模块。它负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和CPU时间,它含有3级缓存设计(2级内存,1级文件)。
Fresco 中设计有一个叫做 Drawees 模块,方便地显示loading图,当图片不再显示在屏幕上时,及时地释放内存和空间占用。
Fresco 支持 Android2.3(API level 9) 及其以上系统。
特性
内存管理
解压后的图片,即Android中的Bitmap,占用大量的内存。大的内存占用势必引发更加频繁的GC。在5.0以下,GC将会显著地引发界面卡顿。
在5.0以下系统,Fresco将图片放到一个特别的内存区域。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。
Fresco 在低端机器上表现一样出色,你再也不用因图片内存占用而思前想后。
图片的渐进式呈现
渐进式的JPEG图片格式已经流行数年了,渐进式图片格式先呈现大致的图片轮廓,然后随着图片下载的继续,呈现逐渐清晰的图片,这对于移动设备,尤其是慢网络有极大的利好,可带来更好的用户体验。
Android 本身的图片库不支持此格式,但是Fresco支持。使用时,和往常一样,仅仅需要提供一个图片的URI即可,剩下的事情,Fresco会处理。
Gif图和WebP格式
是的,支持加载Gif图,支持WebP格式。
图像的呈现
Fresco 的 Drawees 设计,带来一些有用的特性:
自定义居中焦点(对人脸等图片显示非常有帮助)
圆角图,当然圆圈也行。
下载失败之后,点击重现下载
自定义占位图,自定义overlay, 或者进度条
指定用户按压时的overlay
图像的加载
Fresco 的 image pipeline 设计,允许用户在多方面控制图片的加载:
为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片
先显示一个低解析度的图片,等高清图下载完之后再显示高清图
加载完成回调通知
对于本地图,如有EXIF缩略图,在大图加载完成之前,可先显示缩略图
缩放或者旋转图片
处理已下载的图片
WebP 支持

5、Picasso, ImageLoader, Fresco, Glide优劣
首先看Fresco, 它的优点是其他几个框架没有的, 或者说是其他几个框架的短板.
Fresco:
优点:
 图片存储在安卓系统的匿名共享内存, 而不是虚拟机的堆内存中, 图片的中间缓冲数据也存放在本地堆内存, 所以, 应用程序有更多的内存使用, 不会因为图片加载而导致oom, 同时也减少垃圾回收器频繁调用回收Bitmap导致的界面卡顿, 性能更高.
 渐进式加载JPEG图片, 支持图片从模糊到清晰加载
 图片可以以任意的中心点显示在ImageView, 而不仅仅是图片的中心.
 JPEG图片改变大小也是在native进行的, 不是在虚拟机的堆内存, 同样减少OOM

缺点:
 框架较大, 影响Apk体积
 使用较繁琐

ImageLoader, Picasso, Glide: 这三者实现机制都差不多
ImageLoader:
    比较老的框架, 稳定, 加载速度适中, 缺点在于不支持GIF图片加载, 使用稍微繁琐, 并且缓存机制没有和http的缓存很好的结合, 完全是自己的一套缓存机制.
Picasso:
    使用方便, 一行代码完成加载图片并显示, 框架体积小,
缺点在于不支持GIF, 并且它可能是想让服务器去处理图片的缩放, 它缓存的图片是未缩放的, 并且默认使用ARGB_8888格式缓存图片, 缓存体积大.
Glide:
    可以说是Picasso的升级版, 有Picasso的优点, 并且支持GIF图片加载显示, 图片缓存也会自动缩放, 默认使用RGB_565格式缓存图片, 是Picasso缓存体积的一半.

三、实际开发中对View对象注入以及事件绑定的框架
1、ButterKnife(黄油刀)的用法
优势:
1.强大的View绑定和Click事件处理功能,简化代码,提升开发效率
2.方便的处理Adapter里的ViewHolder绑定问题
3.运行时不会影响APP效率,使用配置方便
4.代码清晰,可读性强

使用总结:
1. Activity ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind
2. Fragment ButterKnife.bind(this, mRootView);
3. 属性布局不能用private or static 修饰,否则会报错
4. setContentView()不能通过注解实现。(其他的有些注解框架可以)

官网 http://jakewharton.github.io/butterknife/
使用步骤:
一.导入ButterKnife jar包:
1)如果你是Eclipse,可以去官网下载jar包
2)如果你是AndroidStudio可以直接 File->Project Structure->Dependencies->Library dependency 搜索 butterknife即可,第一个就是
3)当然也可以用maven和gradle配置

注:官网和github也有对应的引用步骤。

二.常见使用方法:
1)由于每次都要在Activity中的onCreate绑定Activity,所以个人建议写一个BaseActivity完成绑定,子类继承即可
注:ButterKnife.bind(this);绑定Activity 必须在setContentView之后:
实现如下(FragmentActivity 实现一样):

2)绑定fragment

3)绑定view
@Bind(R.id.hello_world)
TextView mHelloWorldTextView;
@Bind(R.id.app_name)
TextView mAppNameTextView;//view
4)绑定资源
@BindString(R.string.app_name)
String appName;//sting
@BindColor(R.color.red)
int textColor;//颜色
@BindDrawable(R.mipmap.ic_launcher)
Drawable drawable;//drawble
@Bind(R.id.imageview)
ImageView mImageView;
@Bind(R.id.checkbox)
CheckBox mCheckBox;
@BindDrawable(R.drawable.selector_image)
Drawable selector;

2、Dagger的用法
Dagger的用法详情,请再次猛戳下面链接
http://note.youdao.com/share/?id=2c3e8e32150ced0c354ce59e44cd6824&type=note

四、2016年实际开发进行JSON解析的最火框架
1、FastJson最全面的Json解析框架
FastJson使用详解
一、阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:
速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser。包括自称最快的JackJson;
功能强大,完全支持Java Bean、集合、Map、日期、Enum,支持范型,支持自省;无依赖,能够直接运行在Java SE 5.0以上版本;支持Android;开源 (Apache 2.0)
Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。

FastJson解析JSON步骤
A、服务器端将数据转换成json字符串
首先、服务器端项目要导入阿里巴巴的fastjson的jar包至builtPath路径下(这些可以到fastjson官网下载:http://code.alibabatech.com/wiki/display/FastJSON/Home-zh)
然后将数据转为json字符串,核心函数是:
public static String createJsonString(Object value)
{
String alibabaJson = JSON.toJSONString(value);
return alibabaJson;
}

B、客户端将json字符串转换为相应的javaBean
首先客户端也要导入fastjson的两个jar包
1、客户端获取json字符

2、使用泛型获取javaBean(核心函数)

2、Gson一句代码搞定Json的解析
(一) Gson简介
谷歌GSON这个Java类库可以把Java对象转换成JSON,也可以把JSON字符串转换成一个相等的Java对象。Gson支持任意复杂Java对象包括没有源代码的对象。

(二)Gson解析Json步骤
A、服务器端将数据转换成json字符串
首先、服务器端项目要导入Gson的jar包到BuiltPath中。(
Gson的jar:http://code.google.com/p/google-gson/
然后将数据转为json字符串,核心函数是:
public static String createJsonString(Object value)
{
Gson gson = new Gson();
String str = gson.toJson(value);
return str;
}

B、客户端将json字符串转换为相应的javaBean
首先客户端也要导入gson的两个jar包,json的jar就不需要导入了(因为android项目中已经集成了json的jar包所以这里无需导入)
1、客户端获取json字符串

2、使用泛型获取javaBean(核心函数)

五、发布 / 订阅的事件总线
(一) Otto与EventBus
    这两个框架的实现原理差不多, 在开发中常用Otto.
我们假设这样一种业务场景,现在在做一款及时聊天应用,我们在聊天页面进行收发信息,同时也要实时更新前一页面的聊天记录,这时我们该如何去实现?可以使用的是广播接收器BroadCastReceiver,在接收和发送消息的时候就不停去发送广播,然后在需要实时更新的地方进行接收更新。实现的思想比较简单,也不存在代码上的耦合问题,但是有个弊端。弊端就是需要去在很多地方实现BroadCastRecevier,代码虽不算冗余,但比较多,看起来很是不爽。使用Otto能解决代码体积的问题。Otto是一款目前比较流行事件总线框架,旨在保持应用各页面和模块之间通信高效的前提下,对应用进行解耦。Otto是基于观察者设计模式,简单来说,如果你想订阅某个消息,使用@Subcribe注解即可进行接收,同时使用
Bus.post(Object obj)进行消息的发布,这样的设计达到了完全的解耦。

Otto使用过程:
1、Bus实例化
    Bus这个类是整个框架的灵魂,它负责消息的发布和接收,整个流程都是经过这个Bus去实现的。Bus的实例化推荐使用单例,就是说整个应用内只实例化一个Bus对象,所有的消息的处理都是经过这单一的实例去实现。因为要实现消息的接受者接收到发布的消息,一定要经过同一个Bus对象的处理。Bus的构造器可以接收ThreadEnforcer类型的参数,ThreadEnforcer其实是一个接口,它自身有两个实现,分别表示Bus运行在Main Thread中还是异步线程中。

2、注册和解绑Bus
    根据具体的业务需求进行Bus的注册和解绑,对于android中的组件,一般是基于生命周期方法中去实现;同时如果是任意你自定义的类中都可以进行。下面展示的是在Activity和Fragment里面实现。

3、消息的发布
    发布消息是整个框架中最重要的部分,它允许你告诉所有的订阅者一个事件已经触发。任何一个类的实例对象都可以通过总线Bus去发布,同时也只能被订阅这种对象的接受者所接收。下面展示的是通过Bus去发布一个消息,消息的内容是LocationChangeEvent,所以LocationChangeEvent的接受者都能接收到此发布的消息。注意的是,发布消息只能一个Object对象。

4、消息的订阅
    消息的订阅和发布之前都要在当前的类中进行Bus的注册。订阅是对消息发布的补充,当消息发布的事件调用之后,对应的消息订阅者就能立即接收到此消息。实现订阅功能是通过自定义方法实现的,方法的名称可以随意,同时还得需要满足三个条件。

1、方法前使用@Subscribe注解
2、访问修饰符为public
3、单一参数,根据你想订阅的消息进行设置
注:使用之前,记得进行注册;使用完毕,记得释放。

5、消息的produce
    当订阅者注册完毕,针对特定的消息,通常也需要获取当前已知的值。这个时候,就需要用到produce。同样的使用produce的方法名称可以随意,同时有三点需要注意。
1、方法前使用@produce注解
2、访问修饰符为public
3、无参,返回值是基于订阅者参数类型

    当然Otto的缺点也是有的,要实现上述订阅/发布模型的功能,付出的代价就是对各个注册Bus的类进行反射。如果大量的使用的情况下,对应用的性能多少有点副影响。

实现原理:
    这个框架所实现的功能本质是在一个对象中调用任意的另一个或多个对象中的方法, 而不需要将这个或者这些对象传入调用者. 如果把它们都传入调用者去调用它们的方法, 那么调用者就依赖这些对象, 程序的耦合度就高了, 所以说这个框架是用来解耦的.无论EventBus还是Otto都有一个注册(register)的方法, 方法参数是需要订阅事件的对象.register方法会拿到参数的class文件, Otto通过反射获取类中有@Subscribe注解的方法, 将该Method对象和参数放入Otto内部的一个集合中, 在发布事件时调用post方法, post方法会根据参数类型, 在这个集合中找到register时放入的相对应Method对象, 调用这个Method所需要的对象是register时传入的参数, 所需的参数是post时传入的参数, 这些都已经有了, 直接将它invoke EventBus与Otto不同仅在于Otto是通过注解来确定哪些方法是需要接收事件的方法, 而EventBus是通过固定的方法名来确定的, 所以在项目上线, 代码混淆时, 使用了EventBus的类都不能混淆, 因此在项目中使用Otto会更多一点.

更多相关文章

  1. Android(安卓)Rxjava+Retrofit网络请求框架封装(二)
  2. Android(安卓)开发资料总结--网络请求框架
  3. Activity任务栈和亲属关系(Activities and Tasks)
  4. android动态壁纸1——初步框架(有背景,能使用,仿可爱宝贝)
  5. GreenDao详解
  6. Android(安卓)开发进阶之『清除应用中的内存泄漏』
  7. Android开发者,是时候了解LeakCanary了
  8. Android每天面试一题--Android的Handler机制
  9. Android(安卓)ArrayList LinkedList Set HashMap的介绍.

随机推荐

  1. Android实训_2020/6/16
  2. Android布局中margin,padding,align的区
  3. Android(安卓)获取手机号
  4. Android(安卓)APK反编译
  5. Android的Matrix图像变化原理
  6. android studio 线性布局LinearLayout
  7. Android中间键开发
  8. android RxJava(RxAndroid)的简单使用
  9. Android(安卓)Spannable与SpannableStrin
  10. android 开发之activity之间传递数据