图片加载神装——Picasso

已经用过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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值