已经用过Square公司的很多重量级开源框架了(OkHttp, Retrofit),现在来了解一下加载图片的重量级框架!异步缓存加载图片只需一步~~~
**几大优点:
1.实现了图片异步加载的功能
2.解决了在AdapterView中显示图片时视图回收和再利用产生的问题。由于AdapterView在加载Item时有复用机制——预加载复用已经初始化的容器,离开视野清除容器中的数据。Picasso解决了复用过程中图片加载的问题。
3.自带压缩防止OOM,自带内存、二级缓存机制
4.支持加载res、asserts、local file、ContentProvider中的图片,以及网络图片。**
可以看出上面加载的是本地的图片。
一、Picasso使用前准备工作:
AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET"/>
build.gradle
dependencies {
compile 'com.squareup.picasso:picasso:2.5.2'
}
二、Picasso初体验:
1.加载localfile小例
在Android设备中放置一个图片,比如在根目录下创建一个/content/test.png
再使用Picasso加载本地文件的方法。
String path = "/content/test.png";
// 初始化一个ImageView控件
File localImage = new File(path);
Picasso.with(Context).load(localImage).into(ImageView);
2.加载网络图片小例
在网上照一张美图url,比如:http://a3.att.hudong.com/62/74/19300263504520132460748360286.jpg
String imageUrl = "http://a3.att.hudong.com/62/74/19300263504520132460748360286.jpg";
Picasso.with(this).load(imageUrl).into(ImageView);
其他类似的例子非常多。就不累述了。
三、Picasso的深入理解
1.静态单例构造器:public static Picasso with(Context context) {}方法
使用此方法可以创建Picasso对象
public static Picasso with(Context context) {
if (singleton == null) {
synchronized (Picasso.class) {
if (singleton == null) {
singleton = new Builder(context).build();
}
}
}
return singleton;
}
2.build方法中创建了图片加载的下载器、缓存、服务、请求传递器等对象
public Picasso build() {
Context context = this.context;
// 创建下载器
if (downloader == null) {
downloader = Utils.createDefaultDownloader(context);
}
// 创建内存缓存
if (cache == null) {
cache = new LruCache(context);
}
// 创建服务
if (service == null) {
service = new PicassoExecutorService();
}
// 创建请求传递器
if (transformer == null) {
transformer = RequestTransformer.IDENTITY;
}
Stats stats = new Stats(cache);
Dispatcher dispatcher = new Dispatcher(context, service, HANDLER, downloader, cache, stats);
return new Picasso(context, dispatcher, cache,
listener, transformer, requestHandlers, stats,
defaultBitmapConfig, indicatorsEnabled,
loggingEnabled);
}
3.into 方法
into方法首先进行一系列的校验,如是否是在主(UI)线程,目标ImageView是否为空,URI或ResourceId是否为空等。经过校验后,建立请求,并通过请求生成一个requestKey,该Key即为缓存中缓存该图片的Key值,请求网络前先通过该Key检查图片是否在缓存中。否则将请求加入Picasso的请求队列中。
核心类为Dispatcher,通过DispatcherThread和BitmapHunter进行整个工作队列和Bitmap缓存等的管理。
详细的分析参考:http://blog.csdn.net/u013278099/article/details/50613979
—————————华丽丽的分割线—————————————–