每一个Android 程序员都不是Android应用开发之路上孤军奋战的一我的,GitHub上浩如烟海的开源框架或类库就是前人为咱们发明的轮子,有的轮子能提升软件性能,而有的轮子彷佛是以牺牲性能为代价换取编程速度。擅长利用轮子的程序员已经遥遥领先,不擅长利用轮子的程序员老是嫌前人发明的轮子不够圆,本身造个方轮子上路后才发现落后了。javascript
【51CTO.com原创稿件】每一个Android 程序员都不是Android应用开发之路上孤军奋战的一我的,GitHub上浩如烟海的开源框架或类库就是前人为咱们发明的轮子,有的轮子能提升软件性能,而有的轮子彷佛是以牺牲性能为代价换取编程速度。擅长利用轮子的程序员已经遥遥领先,不擅长利用轮子的程序员老是嫌前人发明的轮子不够圆,本身造个方轮子上路后才发现落后了。java
技术选型的考量点android
来自不一样行业、面向不一样用户的App对功能特性、各方面性能的要求都是不一样的,选择开源框架和类库不能掉以轻心,咱们在选择开源框架以前务必要选择几个考量点进行技术选型。咱们选择开源框架能够从如下三个方面考虑(排名有前后):程序员
一、功能特性:提供的特性是否知足项目的需求。好比Picasso不支持GIF图和视频缩略图等,不适合视频应用。web
二、编程效率:是否有默认参数,配置是否复杂。是否能够一键调用,不须要二次封装。API是否简洁易懂,能够望文生义。仅在module的build.gradle里依赖和还须要在project的build.gradle里依赖对程序员细心程度的要求是不同的,而且须要开发者配置参数的UIL被Picasso取代也不足为奇。算法
三、性能:处理速度不能太慢,稳定性也不能太差,占用内存不该该过高,jar的体积能够不能太大。此外过大的jar包必定包含过多的方法数,积累起来会致使你的APP遇到64K问题。Fresco的体积就太大了点。sql
我为何要把编程效率排在性能以前,由于程序员的工资每一年都在上涨,常常出现薪资倒挂现象,而同等价格的Android设备的性能每18个月翻一番。再举一个极端的例子:“实现“3的3次方”有三种写法:数据库
“3^3”、“3*3*3”、“(3+3+3)+(3+3+3)+(3+3+3)”,显然正常人都会用第一种方法,但第三种方法的性能才是最好的。编程
肯定了技术选型的考量点之后,咱们接下来要肯定最经常使用的六大类开源框架的选型:json
1、网络通讯
Android程序员都是移动互联网开发者,不多有不依赖网络的App,网络权限几乎是每一个App必然要申请的权限,网络通讯框架的选择也是一个App项目中技术选型的最重要组成部分。
android-async-http
android-async-http是Android最经典的网络异步通讯框架,它对Apache的HttpClient API的封装使得开发者能够简洁优雅地实现网络请求和响应。由于Android 6.0之后去掉了HttpClient,这就敲响了android-async-http的丧钟,目前已经不多有人使用这个框架。
OkHttp
OkHttp是Square出品的一个简洁、快速、高效的HTTP客户端,支持HTTP/2以及SPDY,扮演着传输层的角色。它既能在网络性能不好的状况下很好地工做,也可以避免常见的网络链接问题。OkHttp的常规用法:
尽管名字带有“Http”,但OkHttp的功能并不局限于http请求。之前的版本能够经过插件来实现WebSocket长链接,而3.5之后的版本则直接支持WebSocket:
Volley
Volley是Google开发的一个简化网络任务的库。Volley侧重于Request的队列的管理,适合请求、加载、缓存、多线程、同步等各种任务,尤为能使数据量小但通讯频繁的场景中的网络通讯更快、更简单、更健壮。Volley的常规用法:
Volley在频繁访问服务器有很大的优点,OkHttp在性能、速度方面优点明显一,点。咱们能够用OkHttp来扩展Volley,这样能让两者取长补短。
Retrofit
Retrofit并非一个单纯的网络请求函数框架,而是能直接请求获得实体类的整套组合框架。Retrofit默认使用Gson做为JSON解析器,默认使用OkHttp实现网络请求,同时基于注解使得代码变得很是简洁,固然咱们也能够将OkHttp和Gson换成其余的函数库。
【小结】我我的不建议使用有点过分封装的Retrofit,尤为当一个App的团队业务较复杂或人员变更太频繁而致使域名前缀、header、contentType等变化太多时。数据量小但通讯频繁的App,例若有轮询等功能的时候适合用Volley,而中等以上体量的App则适合用OkHttp,但我更建议把OkHttp和Volley结合在一块儿使用。
2、图片缓存与显示
图片从来是Android手机中的吃内存大户,稍不留意就会出现OOM,因此可否作好图片的缓存是一个App性能好坏的决定性指标,对图片缓存与显示框架的技术选型不得不重视。
Universal-Image-Loader
Universal-Image-Loader(如下简称UIL)是Android平台老牌的图片缓存与显示框架,也是大多数3年以上的Android程序员入行以来接触的第一个框架。功能强大灵活且高度可自定义,所以在Picasso流行开来以前一直是最流行的Android图片加载库,目前仍有大量开发者使用。
Picasso
Picasso是著名的Square公司众多开源项目中的一个,最显著的优势就是体积很是轻小,仅有120KB,也所以经常成为众多深刻研读源码的程序员第一个研读的框架。
Glide
Glide是Google官方推荐的用于Android平台上的图片加载和缓存库,被普遍应用在Google的开源项目中。Glide除了为包含图片的滚动列表()作了尽量流畅的优化外,还支持GIF格式图片以及视频缩略图的显示。
可见Glide和Picasso有90%的类似度,只是在细节上仍是存在很多区别。
Glide提供了灵活的API可让开发者方便地替换下载图片所用的网络函数库,默认状况下,它使用HttpUrlConnection做为网络请求模块,开发者也能够根据本身项目的实际需求灵活使用Google的Volley或者Square的OkHttp等函数库进行替换。
Fresco
Fresco是Facebook开源的功能强大的图片缓存与显示框架。图片缓存方案通常有两级缓存,分别是内存缓存和磁盘缓存。目前最流行的“三级缓存”说法是错误的,所谓“网络缓存”并非Android端所控制的。在Fresco中增长了一级内存缓存,这使得Fresco成了加载大量大图以后OOM几率最低的图片缓存与显示框架。
Fresco无与伦比的加载速度和稳定性让它在2015年流行过一阵子,但强大的性能是以增长App 3.4M的体积换来的,而且Fresco使用有些复杂,致使了Fresco只适合大型App;而Picasso的功能太少,仅适用于小型App;综上,通常体量和功能的App建议选择Glide。
咱们不要拘泥于用开源框架或自定义控件加载图片,在电商类应用中常见的相似淘宝详情页的那种很长很长的图片的url,建议直接用WebView显示:
3、数据库操做
Android的数据库是基于开源的SQLite实现的,适用于保存大量数据,不过和上文的JavaScript代码同样,SQL代码也是用String形式的,因此IDE没有自动纠错和代码补全功能,这就意味着咱们须要一个不用写复杂的sql语句,而用简单的API便可完成建立和操纵数据的数据库操做框架。
ORMLite
ORMLite是目前使用人数最多的数据库操做框架,尽管在2013就已经中止维护,但由于操做简便仍然广受欢迎。
SugarORM
SugarORM是一个较冷门的数据库操做框架,性能暂且不论,单凭每次增长列必须在assests里新建一个SQL文件就够让人头疼了。
GreenDAO
GreenDAO是一个轻量级且快速的ORM框架,专门为Android高度优化和定制,它可以支持每秒数千条记录的CRUD操做。尽管读写速度是ORMLite的4倍,但复杂的学习过程和操做方式却使人望而却步。
Realm
Realm并非一个基于SQLite的数据库框架,而是一个自有数据库引擎,而且带有数据库可视化操做工具的整套数据库操做解决方案。
Realm有一个显著的优势是跨平台,Android和iOS开发者无需考虑内部数据的架构,调用Realm提供的API便可轻松完成数据的交换。其次Realm为开发者提供了一个轻量级的数据库可视化操做工具,保证了开发者能够轻松查看数据库中的内容,并实现简单地插入和删除等操做。
Realm的速度也比其余框架快得多,不过Realm的体积高达4.2MB,通常项目可能没法接受。
【小结】综合性能考虑,包大小以及开源库的可持续发展等因素,建议对数据库要求较高的 App采用GreenDAO,对数据要求极其严格的App采用Realm,而通常的App采用ORMLite,毕竟编程效率才是王道。
4、JSON解析与生成
移动互联网产品与服务器端通讯的数据格式,若是没有特殊需求的话,通常都使用JSON格式。Android系统也原生的提供了JSON解析的API,可是速度很是慢,并且没有提供简洁方便的接口来提升开发者的效率和下降出错的可能。
Gson
Gosn是Google出品的JSON解析函数库,能够将JSON字符串反序列化对应的Java对象,或者反过来将Java对象序列化为对应的JSON字符串,免去了开发者手动经过JSONObject和JSONArray将JSON字段逐个进行解析的烦恼,也减小了出错的可能性,加强了代码的质量。使用Gson解析时,对应的Java实体类无需使用注解进行标记,支持任意复杂Java对象包括没有源代码的对象。
上文提到的数据库框架适合存储大量数据,而存储少许数据时则能够用SharedPreferences保存JSON的形式:
Jackson
Jackson是Java语言的一个流行的JSON函数库,并无为Android优化定制过,所以函数保重包含不少非必要的API,用于Android平台会更显著的增大最终生成的APK的体积。
Fastjson
Fastjson是阿里巴巴出品的一个Java语言编写的高性能且功能完善的JSON函数库。它采用一种“假定有序快速匹配”的算法,号称是目前Java语言中最快的JSON库。Fastjson还存在一个专门为Android定制的版本,和标准版本相比,Android版本去掉了一些Dalvik不支持的功能,使得jar包更小。
【小结】在解析长JSON时Fastjson有明显的速度优点,但解析普通长度的JSON时Gson却略胜一筹。从速度、体积、文档和技术支持、官方推荐等方面综合考虑,Gson毫无疑问是最佳选择。
5、组件间通讯
Android中Activity、Service、Fragment等组件以及不一样进程之间的相互通讯主要有Broadcast和Handler两种方法,但这些方法都比较繁琐。事件总线是一种比较简便的方法,其基本原理是发送者把消息发送到事件总线,而后事件总线在接收者中查找哪些方法注册了这个事件,若是某个方法注册了这个事件,就触发该方法。
EventBus
EventBus是专为一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通讯。用事件总线原理实现组件间通讯可能会形成性能问题:EventBus在发布Event的时候就要作好准备可能并无人接受这个Event, Subscribe的时候也要作好准备可能永远不会收到Event。Event不管顺序仍是时间上都某种程度上不太可控。咱们能够利用响应式编程来解决这个问题。
RxJava
RxJava是一个在 JVM 上使用可观测的序列来组成异步的、基于事件的程序的响应式编程框架。若是一个订阅者须要注册多个事件的时候,Rxjava须要一个个单独的注册,而EventBus则能够实现一个订阅者订阅多个事件,和一个事件对应多个订阅者。显然RxJava的性能更好,但EventBus操做更简便。
【小结】组件间通讯框架还有Otto和Guava等许多种,但都在某些方面稍有欠缺,所以咱们技术选型的范围就在EventBus和RxJava之间,建议小型App选择EventBus,体量中等以上的App选择RxJava或RxAndroid。
6、依赖注入
所谓依赖注入,就是目标类(目标类须要进行依赖初始化的类(JavaBean))中所依赖的其余的类的初始化过程,不是经过手动编码的方式建立(findViewById等),而是经过技术手段(注解和反射等)能够把其余的类的已经初始化好的实例自动注入到目标类中。
AndroidAnnotations
AndroidAnnotations是功能最丰富的依赖注入框架,但存在体积过于庞大、与其余利用注解的框架有冲突、输出太多logcat、须要生成一个以“_”结尾的新类都是与追求编程效率的初衷相违背的。
ButterKnife
ButterKnife具有AndroidAnnotations的大多数主要功能,而且使用简便,这是ButterKnife在Activity中的使用:
ButterKnife能加强代码的可读性,提升编程效率,但若是你用Android Studio搜索Android ButterKnife Zelezny插件后,你会发现写以上代码也是浪费时间之举,由于这些都能自动实现。
【小结】AndroidAnnotations和ButterKnife都是牺牲运行性能换取开发速度的工具,体积庞大的AndroidAnnotations对compile速度较大,而ButterKnife对runtime性能的影响略大于AndroidAnnotations。综合考虑以后,为了写出更高质量的代码,也为了debug更简便,我选择了ButterKnife。
【写在最后】
上述Android开源框架的合理利用能加快开发进度,也能提升代码可维护性。除了上述几大框架,Android开源框架还有多媒体、文件I/O、动画等多个大类,合理运用开源框架提升编程效率节省下来的时间能够用于读书、健身或陪陪本身的另外一半,早日成为人生赢家。
欢迎扫码加群学习
【51CTO原创稿件,合做站点转载请注明原文做者和出处为51CTO.com】