缓存 DiskLruCache
LRU(Least Recently Used),即近期最少使用算法。
使用缓存策略, 对网络上下载的图片等资源文件进行缓存, 当再次请求同一个资源url时, 首先从缓存中查找是否存在, 当不存在时再从网络上下载。
采用缓存, 除了提高获取资源的速度, 也对减少使用用户手机上的流量有很好的作用. 核心思想是当缓存满时,会优先淘汰那些最少使用的缓存对象。
采用LRU算法的缓存有两种,LruCache用于内存缓存, DiskLruCache用于存储设备缓存, 它通过把对象写入文件系统从而实现缓存的效果。
图片加载
Android-Universal-Image-Loader
多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等
支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置
支持图片的内存缓存,文件系统缓存或者SD卡缓存
支持图片下载过程的监听
根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存
较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片
提供在较慢的网络下对图片进行加载
Volley
Android Volley 是Google开发的一个网络lib,可以让你更加简单并且快速的访问网络数据。Volley库的网络请求都是异步的,你不必担心异步处理问题。
Volley的优点:
- 请求队列和请求优先级
- 请求Cache和内存管理
- 扩展性强
- 可以取消请求
Picasso
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
Picasso不仅实现了图片异步加载的功能,还解决了android中加载图片时需要解决的一些常见问题:
在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题;
使用复杂的图片压缩转换来尽可能的减少内存消耗;
自带内存和硬盘二级缓存功能。
Fresco
Fresco 是 facebook 的开源类库,它支持更有效的加载网络图片以及资源图片。它自带三级缓存功能,让图片显示更高效。
Fresco 是一个强大的图片加载组件。
Fresco 中设计有一个叫做 image pipeline 的模块。它负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和CPU时间,它含有3级缓存设计(2级内存,1级文件)。
Fresco 中设计有一个叫做 Drawees 模块,方便地显示loading图,当图片不再显示在屏幕上时,及时地释放内存和空间占用。
Fresco 支持 Android2.3(API level 9) 及其以上系统。
Glide
官方推荐
Glide可以加载GIF动态图;
Glide和Activity/Fragment的生命周期是一致的;
图片处理
picasso-transformations
一个为Picasso提供多种图片变换的库
glide-transformations
一个为Glide提供多种图片变换的库
android-gpuimage
基于OpenGL的Android过滤器
网络请求
网络请求开源库是一个将网络请求的相关功能封装好的类库,并对外提供Api:
没有网络请求框架之前
App想与服务器进行网络请求交互是一件很痛苦的事:因为Android的主线程不能进行网络请求,还需要另外开一个线程进行请求,然后又要考虑到线程池,缓存等一堆问题。
- 使用网络请求库后(前人的轮子)
实现网络请求的需求同时不需要考虑异步请求、线程池、缓存等问题,同时还降低开发难度、缩短开发周期、使用方便。
Android实现网络请求的主流方法(SDK自带)
HttpClient
优点:相比于HttpURLConnection,更加高效简洁
缺点:结构过于复杂;维护成本高
在5.0版本后被Android官方弃用
HttpURLConnection
在Android2.2之前,HttpURLConnection 有个重大 Bug:调用 close() 函数会影响连接池,导致连接复用失效
在Android2.2之后:HttpURLConnection默认开启了 gzip 压缩&提高了HTTPS 的性能
Android主流网络请求开源库
android-async-http
创建一个AsyncHttpClient;
(可选的)通过RequestParams对象设置请求参数;
调用AsyncHttpClient的某个get方法,传递你需要的(成功和失败时)callback接口实现,一般都是匿名内部类;
实现AsyncHttpResponseHandler,类库自己也提供了好些现成的response handler,你一般不需要自己创建一个。
volley
适用于数据量不大,但网络通信频繁的操作
ok-http
支持HTTP/2, HTTP/2通过使用多路复用技术在一个单独的TCP连接上支持并发, 通过在一个连接上一次性发送多个请求来发送或接收数据
如果HTTP/2不可用, 连接池复用技术也可以极大减少延时
支持GZIP, 可以压缩下载体积
响应缓存可以直接避免重复请求
会从很多常用的连接问题中自动恢复
如果您的服务器配置了多个IP地址, 当第一个IP连接失败的时候, OkHttp会自动尝试下一个IP
OkHttp还处理了代理服务器问题和SSL握手失败问题使用 OkHttp 无需重写您程序中的网络代码。OkHttp实现了几乎和java.net.HttpURLConnection一样的API。如果你用了 Apache HttpClient,则OkHttp也提供了一个对应的okhttp-apache 模块。
retrofit
Retrofit是一个RESTful的HTTP网络请求框架的封装。注意这里并没有说它是网络请求框架,主要原因在于网络请求的工作并不是 Retrofit 来完成的。
Retrofit 2.0 开始内置 OkHttp,前者专注于接口的封装,后者专注于网络请求的高效,二者分工协作。
我们的应用程序通过 Retrofit 请求网络,实际上是使用 Retrofit 接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作,在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,后者根据用户的需求对结果进行解析的过程。
讲到这里,你就会发现所谓Retrofit,其实就是Retrofitting OkHttp 了。
Retrofit还有一个特性就是支持RxJava。
网络解析
json解析
JSON不管是在Web开发还是服务器开发中是相当常见的数据传输格式,一般情况我们对于JSON解析构造的性能并不需要过于关心,除非是在性能要求比较高的系统。
gson
gson是目前功能最全的json解析神器,json当初是为因应google公司内部需求而由google自行研发而来,但自从在2008年五月公开发布第一版后已被许多公司或用户应用。
gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。
gson完全可以将复杂类型的json到bean或bean到json的转换,使用简洁,是JSON解析的神器。
fastjson
fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。无依赖,不需要例外额外的jar,能够直接跑在JDK上。
fastjson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
fastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
jackson
相比json-lib框架,jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且jackson社区相对比较活跃,更新速度也比较快。
jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式。
xml(html)解析
- HtmlParser
一种用来解析单个独立html或嵌套html的方式
- Jsoup
一个以最好的DOM,CSS和jQuery解析html的库
数据库
OrmLite
对象关系映射
优点
轻量级
使用简单,易上手
封装完善
文档全面
缺点
基于反射,效率较低
缺少中文翻译文档
sugar
不用写复杂的sql语句,而用简单的API即可完成创建和操纵数据
可以在原有的Bean上仅仅添加小的修改而复用Bean
简化而明了的数据库设计和创建过程,同时提供表的一对多的支持
greenDAO
greenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,它能够让你操作数据库时更简单、更方便。如下图所示:
GreenDao 优点:
性能高,号称Android最快的关系型数据库
内存占用小
库文件比较小,小于100K,编译时间低,而且可以避免65K方法限制
支持SQLCipher进行数据库加密
简洁易用的API
GreenDao 3.0改动:
使用过GreenDao的同学都知道,3.0之前需要通过新建GreenDaoGenerator工程生成Java数据对象(实体)和DAO对象,非常的繁琐而且也加大了使用成本。
GreenDao 3.0最大的变化就是采用注解的方式通过编译方式生成Java数据对象和DAO对象。
ActiveAndroid
以活动记录方式为Android SQLite提供持久化
sqlbrite
SqlBrite 是对 Android 系统的 SQLiteOpenHelper 和 ContentResolver 的轻量级 Rx 封装,用来在 RxJava 中使用。
realm
Realm 是一个跨平台的移动数据库引擎,于 2014 年 7 月发布,准确来说,它是专门为移动应用所设计的数据持久化解决方案之一。
Realm 可以轻松地移植到您的项目当中,并且绝大部分常用的功能(比如说插入、查询等等)都可以用一行简单的代码轻松完成!
Realm 并不是对 Core Data 的简单封装,相反地, Realm 并不是基于 Core Data ,也不是基于 SQLite 所构建的。它拥有自己的数据库存储引擎,可以高效且快速地完成数据库的构建操作。
之前我们提到过,由于 Realm 使用的是自己的引擎,因此, Realm 就可以在 iOS 和 Android 平台上共同使用(完全无缝),并且支持 Swift 、 Objective-C 以及 Java 语言来编写( Android 平台和 iOS 平台使用不同的 SDK )。
数以万计的使用 Realm 的开发者都会发现,使用 Realm 比使用 SQLite 以及 Core Data 要快很多。
依赖注入
首先我们需要知道,人们在很长的一段时间里都是利用控制反转原则规定:应用程序的流程取决于在程序运行时对象图的建立。通过抽象定义的对象交互可以实现这样的动态流程,而使用依赖注入技术或者服务定位器便可以完成运行时绑定。
使用依赖注入可以带来以下好处:
依赖的注入和配置独立于组件之外;
因为对象是在一个独立、不耦合的地方初始化,所以当注入抽象方法的时候,我们只需要修改对象的实现方法,而不用大改代码库;
依赖可以注入到一个组件中:我们可以注入这些依赖的模拟实现,这样使得测试更加简单。
ButterKnife
Butter Knife,专门为Android View设计的绑定注解,专业解决各种findViewById。
Dagger2
@Inject: 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。
@Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules)。
@Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
@Component: Components从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。 Components可以提供所有定义了的类型的实例,比如:我们必须用@Component注解一个接口然后列出所有的@Modules组成该组件,如 果缺失了任何一块都会在编译的时候报错。所有的组件都可以通过它的modules知道依赖的范围。
@Scope: Scopes可是非常的有用,Dagger2可以通过自定义注解限定注解作用域。后面会演示一个例子,这是一个非常强大的特点,因为就如前面说的一样,没 必要让每个对象都去了解如何管理他们的实例。在scope的例子中,我们用自定义的@PerActivity注解一个类,所以这个对象存活时间就和 activity的一样。简单来说就是我们可以定义所有范围的粒度(@PerFragment, @PerUser, 等等)。
Qualifier: 当类的类型不足以鉴别一个依赖的时候,我们就可以使用这个注解标示。例如:在Android中,我们会需要不同类型的context,所以我们就可以定义 qualifier注解“@ForApplication”和“@ForActivity”,这样当注入一个context的时候,我们就可以告诉 Dagger我们想要哪种类型的context。
AndroidAnnotations
快速安卓开发,易于维护
roboguice
Roboguice 是基于guice-noaop的android注入框架
Roboguice在运行时利用反射进行依赖注入
使用简单
图表
WilliamChart
WilliamChart 是一个为安卓项目提供图表控件的开源库,他实现了数字的可视化,用作者的话说“我者喜欢看起来干净简单的图表,不想要那么多花哨的功能”。
HelloCharts
HelloCharts支持以下chart类型:
Line chart(cubic lines, filled lines, scattered points)
Column chart(grouped, stacked, negative values)
Pie chart
Bubble chart
Combo chart(columns/lines)
Preview charts(for column chart and line chart)
此外还具有以下特点:
支持缩放、滑动以及平移。Zoom(pinch to zoom, double tap zoom), scroll and fling
支持自定义坐标轴(比如坐标轴位置:上下左右内部),支持自动生成坐标轴。Custom and auto-generated axes(top, bottom, left, right, inside)
动画(Animations)
支持预览,即在chart下面会有一个坐标密度更细的附属chart,当选中附属chart的某一区域,附属chart上面的chart会显示选中区域的更详细情况。
MPAndroidChart
核心功能
支持x,y轴缩放
支持拖拽
支持手指滑动
支持高亮显示
支持保存图表到文件中
支持从文件(txt)中读取数据
预先定义颜色模板
自动生成标注
支持自定义x,y轴的显示标签
支持x,y轴动画
支持x,y轴设置最大值和附加信息
支持自定义字体,颜色,背景,手势,虚线等
后台处理
tape
一个轻快的,事务性的,基于文件的FIFO的库
Android Priority Job Queue
一个专门为Android轻松调度任务的工作队列
事件总线
EventBus
安卓优化的事件总线,简化了活动、片段、线程、服务等的通信
Otto
一个基于Guava的增强的事件总线
响应式编程
RxJava
JVM上的响应式扩展
RxJavaJoins
为RxJava提供Joins操作
RxAndroid
Android上的响应式扩展,在RxJava基础上添加了Android线程调度
RxBinding
提供用RxJava绑定Android UI的API
Agera
Android上的响应式编程
Log框架
Logger
简单,漂亮,强大的Android日志工具
Hugo
在调试版本上注解的触发方法进行日志记录
Timber
一个小的,可扩展的日志工具
测试框架
Mockito
Java编写的Mocking单元测试框架
Robotium
Android UI 测试
Robolectric
Android单元测试框架
Android自带很多测试工具:JUnit,Monkeyrunner,UiAutomator,Espresso等
调试框架
Stetho
调试Android应用的桥梁,使得可以利用Chrome开发者工具进行调试
性能优化
LeakCanary
内存泄漏检测工具
ACRAAndroid
应用程序崩溃报告