缓存 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。