图片加载神装——Picasso

已经用过Square公司的很多重量级开源框架了(OkHttp, Retrofit),现在来了解一下加载图片的重量级框架!异步缓存加载图片只需一步~~~

**几大优点:
1.实现了图片异步加载的功能
2.解决了在AdapterView中显示图片时视图回收和再利用产生的问题。由于AdapterView在加载Item时有复用机制——预加载复用已经初始化的容器,离开视野清除容器中的数据。Picasso解决了复用过程中图片加载的问题。
3.自带压缩防止OOM,自带内存、二级缓存机制
4.支持加载res、asserts、local file、ContentProvider中的图片,以及网络图片。**

用过的朋友都说好!先看效果:
图片加载神装——Picasso_第1张图片

可以看出上面加载的是本地的图片。
一、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

—————————华丽丽的分割线—————————————–

你可能感兴趣的:(Android)