图片下载框架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类来实现的。
先分析到这里,休息下!!!!!!!!!
一.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类来实现的。
先分析到这里,休息下!!!!!!!!!
相关文章推荐
- python 类成员变量
- HDU 5733 tetrahedron(几何——四面体内心/体积/内切圆)
- FYI怎么理解
- Oracle常用命令
- 如何在Mac下正常的安装Ruby环境
- iOS开发自定义流水布局
- Web Worker Best Practices
- Web Worker Best Practices
- git问题集锦
- HTML 保存图片到本地
- jsp 获取url的参数
- linux cp命令参数及用法详解---linux 复制文件命令cp
- 使用基于Apache Spark的随机森林方法预测贷款风险
- Android Studio与eclipse的区别
- 自定义GridView的使用(盒子应用)
- flume参考文档
- Refs
- 144. Binary Tree Preorder Traversal
- Python爬虫----实例: 抓取百度百科Python词条相关1000个页面数据
- Navicat for mysql 中文显示为乱码解决方案