Android Picasso 原理解析

本文详细介绍了Picasso图片库的功能特性,包括内存缓存、磁盘缓存的实现,以及源码结构分析。Picasso提供默认的内存和磁盘缓存,支持自定义变换、裁剪、加载策略等。文章还探讨了Picasso的构建过程、请求创建、调度系统、RequestHandler、BitmapHunter等核心组件的工作原理,并给出了加载流程的整体分析。
摘要由CSDN通过智能技术生成

另一个常用的图片库Glide的解析,可以参考这篇文章

一.提供的功能特性

  1. 使用默认的内存缓存和磁盘缓存(可自定义)

  2. 可自定义图片的变换操作、解析格式等

  3. 可以选择裁剪方式、大小等

  4. 可以加载网络资源、本地资源等

  5. 可以选择内存缓存和磁盘缓存的策略

  6. 可以暂停、恢复、取消加载

  7. 可以设置加载成功失败的占位图及相应监听

二.简单使用

Picasso.with(context)//拿到Picasso对象
				.load(url)//load一个url
                .resize(width, height)//重新裁剪大小
                .memoryPolicy(MemoryPolicy.NO_STORE)//内存缓存策略(不存入内存)
				.networkPolicy(NetworkPolicy.OFFLINE)//磁盘缓存策略(不通过网络请求)
                .into(imageView);//显示到ImageView中

三.源码结构

1.整体类图

在这里插入图片描述

2.内存缓存

在这里插入图片描述

  1. picasso默认的内存缓存实现是LruCache类,维护一个Lru规则的LinkedList存储key和bitmap

  2. 默认的缓存大小为堆内存的1/7,约15%

  3. 我们可以自己实现Cache类来设置到Picasso的全局环境中(下面会提到)

3.磁盘缓存

在这里插入图片描述

  1. picasso提供了两个磁盘缓存类OkHttpDownloader、UrlConnectionDownloader,在引入OkHttp库时会使用OkHttpDownloader

    static Downloader createDefaultDownloader(Context context) {
         
      try {
         
        Class.forName("com.squareup.okhttp.OkHttpClient");
        return OkHttpLoaderCreator.create(context);
      } catch (ClassNotFoundException ignored) {
         
      }
      return new UrlConnectionDownloader(context);
    }
    
  2. OkHttpDownloader里面的操作其实是靠OkHttpClient完成,其通过设置headers的一些属性来实现磁盘缓存,HttpUrlConnection也是通过类似方式实现

  3. OkHttpClient可以设置其Cache对象,默认为一个DiskLruCache,提供get、put等方法,在使用OkHttpClient请求时,会根据其设置headers属性来决定DiskCache的存取

  4. 磁盘缓存默认路径为应用的cache文件夹下的picasso-cache文件夹,大小为可用磁盘空间的2%(5~50MB)

  5. 我们可以自己实现一个Downloader设置到picasso全局环境中(下面会提到),来进行磁盘缓存

4.Picasso对象

下面就来按步骤分析一下picasso加载图片的流程,首先看Picasso.with(context)获取Picasso对象
在这里插入图片描述

  1. 由图可知,Picasso是通过builder模式构建的,Builder类提供一些方法设置全局环境,如BitmapConfig、Downloader、cache等,所以我们可以自己创建这样的builder,并设置相应属性,build后调用setSingletonInstance设置到单例对象上即可

  2. 默认创建Picasso对象时,使用的是默认的属性,如上面提到的OkHttpDownloader、LruCache等

5.RequestCreator对象

在我们调用load(url)方法后,返回的是一个新的RequestCreator对象,这个对象是包装各种请求参数用的,其相关方法为链式调用
在这里插入图片描述

  1. RequestCreator对象提供了各种占位图的设置方法以及缓存策略的方法

  2. 其内部封装了一个Request.Builder对象,用于设置图片相关参数,也是通过builder模式创建;如加载的uri、resize的大小、裁剪方式等,对我们其实是不可见的

6.Action对象

在这里插入图片描述

  1. 由图可知,Action抽象类提供了加载完成后的一些回调方法,不同的实现类用于以不同方式处理加载完成的后续工作,在我们into(iv/target/…)后会构建相应的Act

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值