Android应用开发经过了这么多年的发展,从“原始时代”很多的UI效果和功能都需要开发者纯手工打造,到如今“工业时代”的各种第三方组件,服务层出不穷,让人眼花缭乱,极大地降低了应用开发的门槛。应用的开发实际上越来越简单、快速,各式“轮子”已经造好,开发者只需将它们组装在自己的应用上,就能让它飞奔起来。
现在做Android应用开发,如果要实现某个较为复杂的功能,我们可以先去找找该功能有没有现成的实现,如果有,则可以拿过来试玩一番,如果能够满足功能需要,那么就集成到应用中;如果不能完全满足,则可将其做少许修改再集成。不管是何种方式,大部分情况下都比自己从0到1快得多,后续如果有空闲机会,找个咖啡厅,点杯咖啡,将“轮子”拆解出来把玩一番,看看其内部的实现原理,或吐槽或惊叹,也是消磨单身时光的好方式。当然,也不是说一味地集成“轮子”,有时候根据情况还是有必要自己造“轮子”。
本文盘点了目前Android开发领域流行的第三方组件或服务。
1 AppBrain平台AppBrain的网址为www.appbrain.com。它是一个Android应用推广平台,产品运营的同学可以在上面投放广告,开发的同学可以在自己的应用中集成它的广告条,赚钱广告费。但这些都不是重点,AppBrain上有对Google Play市场中所有应用的数据和技术分析,这些信息对于开发者来说是有价值的。
打开AppBrain主页,在主页中找到搜索按钮,比如我们想搜索Facebook的Android应用的相关数据,就在搜索框中输入Facebook,然后搜索,如图所示。
在搜索结果列表中,我们单击第一条结果进入详情界面,可以看到Facebook这个应用在Google Play上的基本信息,如安装量、评分等,还可以看到它在Google Play上排名的历史记录、应用使用的权限及第三方库。
作为开发者,我们可以通过这种方法,搜索Google Play上任何一个产品使用了哪些库,尤其是与自己的应用功能相似的App,为自己的产品开发提供一些借鉴,这比反编译一个APK还要方便。
另外,我们可以单击主页右上角Statistics菜单,进入数据统计界面,然后单击左侧菜单栏底部的Android library stats组下的Development tools stats,查看当前Google Play市场上应用使用的开发工具,即第三方组件的情况。
我们可以看到Android Support library以72.51%的占比排名第一,当然这个排行榜是动态更新的.通过这个排行榜,我们可以知道当前有哪些第三方组件或者开发工具使用得比较频繁,然后可以进行使用分析,看是否可以集成到自己的项目中。
2 Butter KnifeButter Knife直译过来为黄油刀的意思。它使用编译时注解的方式来完成Android中控件和点击事件的绑定,极大地解放了开发者的双手,不用再去重复地写findViewById以及setOnClickListener等代码,提升了开发效率。ButterKinfe的使用非常简单,可参考GitHub官方文档https://github.com/JakeWharton/butterknife来集成。
3 EventBusEventBus是事件总线的意思,用来简化Android组件之间的通信,这些组件包括Activity、Fragment、Thread、Service等,其实只要是一个Java类,都能使用EventBus来完成通信。类似的通信组件还有Square公司Otto,根据EventBus官方性能测试对比报告(https://github.com/ greenrobot/EventBus/blob/master/COMPARISON.md),EventBus在速度上具有压倒性优势。
Android消息传递实现方式有很多种,有Handler、本地广播和全局广播、Intent、接口回调、观察者模式等,Handler可以实现线程间的通信,使用场景包括处理种类繁多的事件,子线程与主线程的切换等;BroadcastReceiver可以实现进程间通信,主要用来接收一些系统广播,也可用进行组件之间的通信,如Service和Activity之间的通信;Intent可以完成两个组件之间的通信,传递一些简单的数据;接口回调一般用在事件触发通知。我们需要根据具体场景来使用不同方式。那么什么时候使用EventBus呢?当一个事件在应用内传递,如果使用接口回调实现时需要多次回调,路线较远,代码烦琐,如果使用BroadcastReciever又觉得大材小用。这时就可以考虑使用EventBus了,它能够从事件发送的地方直接传递到事件接收的地方。当然,如果能够使用一次接口回调解决的问题,还是推荐使用接口回调。
4 Dagger2Dagger是一个快速的依赖注入框架,供Android和Java开发使用,目前使用较多的是2.x版本,所以通常称之为Dagger2。Dagger以前由Square维护,现在转交给Google,GitHub的链接为https://github.com/google/dagger。Dagger为依赖注入而生。什么是依赖?什么是注入?为什么要使用依赖注入?这是我们学习Dagger之前必须要了解的。依赖就是一个类中要使用其他的类来完成某些工作,这样一个类就依赖了另外一个类。比如在MainActivity中必须使用一个User类的对象,那么MainActivity就依赖了User类。
代码语言:javascript复制public class MainActivity extends AppCompatActivity {
User mUser;//MainActivity依赖User类
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mUser = new User();//初始化mUser
setContentView(R.layout.activity_main);
}
}
上述代码中,在MainActivity中直接初始化mUser对象,但如果User类的构造方法中增加了一个参数,比如用户名,那么所有调用User的无参构造方法的地方全部要修改,这显然不是我们希望看到的。于是我们思考可不可以提供一个User的工厂类或者容器类专门负责User对象的创建,这样User对象的创建就不会跟MainActivity发生耦合,不管User的构造方法如何变,都不会影响到MainActivity。那么代码可能是这样的:
代码语言:javascript复制public class MainActivity extends AppCompatActivity {
User mUser;//MainActivity依赖User类
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mUser = UserFactory.getUser()//通过工厂类注入mUser
setContentView(R.layout.activity_main);
}
}
这样mUser对象就不是在MainActivity创建,而是由UserFactory创建,设置给mUser对象,这就可以称之为mUser被注入了。MainActivity不需要关心User对象是怎样创建出来的,对User对象创建的修改也不会影响到MainActivity里面的代码,这就是依赖注入的好处。这就好比我们打针,人体依赖药液来治疗疾病,但药液并不是人体自己生产的,而是医药公司生产然后通过注射器注入人体,而我们人体则无须关心药液是如何被制造出来的。
Dagger的作用就是通过编译时注解方式,帮我们自动生成创建对象的工厂类。
5 OkHttpOkHttp是Android和Java应用的HTTP和HTTP/2的客户端,由Square公司维护,GitHub地址为https://github.com/square/okhttp。OkHttp具有一些高效的属性:
在HTTP/2支持下,如果网络请求的host是同一个时,允许这些请求共用一个socket。使用连接池减少网络延时(如果HTTP/2不可用)。透明的GZIP压缩,减少数据流量。缓存网络响应,避免重复网络请求。OkHttp还能够自动从常见的网络错误中恢复过来。如果你的服务有多个IP地址,当第一次连接失败,它会选择另外的IP地址重试。使用OkHttp非常简便,它的请求和响应的API大都采用建造者模式设计。
6 RetrofitRetrofit是一个类型安全的HTTP的客户端,在Android和Java中都可使用。Retrofit通过注解实现RESTful网络接口,底层使用OkHttp完成网络请求的实现。另外,Retrofit封装了主线程和子线程的切换以及网络数据的解析,在使用上要比OkHttp便利不少。
7 VolleyVolley是在Google I/O 2013大会上发布的网络通信库,它可以使网络通信更快、更简单、更健壮。适用于数据量不大但通信频繁的场景,不适合大文件下载,大文件下载可以使用OkHttpClient或者HttpURLConnection等较为底层的网络库。
Volley作为一个网络框架,它封装了网络处理方面通用的需求。我们知道Android端必须在子线程中发送网络请求,当结果返回后,需要在主线程中刷新UI,这里就涉及子线程到主线程的切换,几乎所有使用网络的应用都会这样处理,所以Volley把线程切换封装起来。另外,我们在某些应用场景下需要缓存网络数据,这也是比较常见的需求,Volley也进行了缓存的封装。对比其他网络框架,OkHttpClient封装了缓存,Retrofit又是对OkHttpClient的一层封装,并且增加了线程切换的封装。
Volley其他功能还包括JSON、图片的请求、请求优先级的处理、请求的取消等。
HttpURLConnection、HttpClient和OkHttp是属于同一层级的网络库,而Volley与Retrofit则是在封装层级上更高层的网络库。Volley是对网络库HttpURLConnection和HttpClient的封装,由于Volley良好的扩展性,它还可以配置成使用OkHttp来作为自己的底层网络库,而Retrofit则是对OkHttp的封装。Volley和Retrofit在封装层级上属于同一层次。
8 RxJava说到RxJava,不得不先提到ReactiveX。ReactiveX官方的介绍是:A library for composing
asynchronouse and event-based programs by using observables sequences。翻译过来为一个使用可观察序列来编写异步和基于事件的程序的库。如果没有使用过ReactiveX,那么听起这个定义就会感觉非常抽象与晦涩。我们可以提取几个关键词:可观察、异步、事件。可观察说明ReactiveX使用观察者模式,异步说明可以完成多线程编程,事件说明会涉及事件的传递和处理。
ReativeX实际上是一种编程思想,基于观察者模式,支持流水式的处理数据或者事件,并提供大量的操作符来处理数据和事件序列而不需要关心底层多线程相关问题。这对于我们处理复杂烦琐的数据和业务逻辑提供了极大的便利,让我们编写出来的代码逻辑上清晰简洁,减少出错的概率。ReactiveX支持的语言、平台和框架如图所示。
RxJava实际上是ReactiveX在JVM上的一种实现,另外,我们还有在Android平台上的扩展库RxAndriod。
本文只是简单介绍了目前Android开发领域流行的第三方组件或服务,若要了解更详细使用及源码分析可见《Android应用开发进阶》一书。