您的位置:首页 > 其它

图片下载框架Picasso实现原理解析(上)

2016-07-20 14:20 323 查看
Picasso框架解析
一.Picasso功能:

  图片加载

二.Picasso使用:

最简单的是Picasso.with(Context).load(Url).into(ImageView),Context是环境(不管是什么Context,在Picasso里都会转
 化为application的context),URL则为要下载的图片地址,ImageView是要显示图片的view。

1.首先分析Picasso的with()函数:(返回默认配置Picasso实例)



可以看到,Picasso采用单例模式保证全局的唯一性(用的是DCL,在JDK1.5以后使用volatile可以在低并发的情
况下实现单例模式的功能,但由于Java操作的非原子性及JVM的乱序优化,有小概率会产生DCL失效。改进方法是采
用静态内部类或枚举。)Picasso同时采用Builder模式,用来配置实例对象,并通过调用Builder的build()生成Picasso
对象。

该方法会返回一个Picasso实例,且采用的是默认的配置(下载器,缓存,线程池,转换器)。所以,要得到Picasso 的实例,除了调用Picasso.with()函数,还可以自己创建Picasso.Builder对象,然后按照需求配置下载器,缓存,线程池,
转换器等。



1.下载器Downloader:接口,主要声明下载抽象函数load() ,和关闭shutdown()

具体实现是OkHttpLoaderCreator(如果包含库里有,然而Picasso库里没有)或UrlConnectionCreator(实际用到)

对于UrlConnectionCreator,内部使用的是HttpConnection来进行网络连接就数据获取



并把请求结果封装为一个Response对象



Response对象包含了请求的InputStream和一些基本信息。

URLConnectionCreator里面还使用了磁盘进行缓存。

2,缓存cache:接口,对Bitmap的缓存,主要提供了get()和set()及clearKeyUri()方法



在Picasso里的具体实现是LruCache近期最少使用算法的缓存机制,LruCache内部拥有一个LinkedHashMap,其key
为索引,value为Bitmap。LinkedHashMap的内部实现保存了添加的顺序,所以,当LruCache里面的缓存比设定的
最大值大时,就会把最先添加的那些缓存清除掉。



3.线程池ExcutorService:Picasso内部使用的是继承ThreadPoolExecutor的PicassoExcutorService,其内部默认使用
3个核心线程同时也把最大线程数设置为3,采用优先阻塞队列,而线程工厂则使用自定义的工厂,其作用是生产 出优先级为最高的线程(priority=10)

4.请求转换器RequestTransformer,默认不做转换



 

 

2.接着看Picasso.load()函数



该函数有四种重载方法,其中Uri,String,File最终都转化为Uri进行请求,而int则是app内部的资源访问。

load()函数返回RequestCreator对象,



该对象代表着请求的结果,它提供了许多函数用来对请求结果的操作。

RequestCreator的成员变量里有一个重要的对象是Creater(其有一个内部类Builder),RequestCreator里很多函数都是桥
接到该Builder。



 

3.最后是into()函数,该函数是RequestCreator类的方法,它有五种重载



分别用于把请求结果输出到指定对象上。

三.上层类分析

1.Picasso:

submit()函数:用于把RequestCreator提交上来的Action添加到队列里,该函数其实是把提交任务交给Dispatcher



而Dispatcher最后则通过handler把任务切换到Dispatcher所在的线程(后台线程,因为要进行网络访问),

2.RequestCreator:

四.底层分析

1.Stats:对请求整个过程的一个记录,如命中(hit)缓存的次数,不命中(miss)缓存的次数,Bitmap下载解析次数,
下载完成次数等。(我觉得这个类一个得叫Status把???)

2.Dispatcher:

3.RequestCreator:

该类用于配置请求,如当正在执行图片下载是ImageView该显示的图片,下载失败时ImageView该显示的图片,是 否适配大小,设置图片的严格大小,居中,旋转,等。其实最后就是把这些配置交给Request的内部类Builder。



RequestCreator最重要的一个方法是into(),在into()方法调用之前所调用的一切配置函数都只是把配置信息储
存起来,而没有做网络请求,当调用into()函数后才开始网络请求。into()函数有五个重载方法,用于把请求结果存 放或显示到指定位置。



这里分析into到ImageView里,该函数首先会查看缓存里是否有请求的Bitmap,如果有那最好,都不用进行网络请求,
直接把Bitmap显示到ImageView里。如果缓存里没有,则会把请求加入到请求队列里,之后进行网络请求。

到这里,又把控制权交给Picasso类。

 


4.Request:

Request有一个内部静态类Builder,很明显,采用的是Builder模式,Builder用于接收各种请求的配置信息,当调用
Builder的build()方法是,创建Request对象,并把各种配置信息传给Request,然后返回Request对象。

Request对象有最重要的一点就是重写了toString(),得到包含各种配置信息的字符串请求报文。

 

5.Action:一个没有Set的Bean,包含各种动作信息,如网络请求策略,内存策略,请求配置等。

6.ImageViewAction:Action的子类,内部有complete()和error()函数,用于把请求结果显示到ImageView上



其实Picasso里用来在指定目标上显示结果都是通过PicassoDrawable类来实现的。

先分析到这里,休息下!!!!!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: