Android Picasso归纳以及谜一般的缓存

jar包地址:http://square.github.io/picasso/#download


教程一

参考:http://blog.csdn.net/smallcheric/article/details/51049638

从Android Resource 、File、URI、网络加载图片


教程二

参考:http://blog.csdn.net/smallcheric/article/details/51050399

Picasso支持ListView和GridView图片加载

cancelRequest:取消网络请求

placeHolder:未完成加载时图片默认展示

error:加载错误是图片默认展示


教程三

参考:http://blog.csdn.net/smallcheric/article/details/51055013

noFace:取消图片转换时的渐变效果

noPlaceHolder:取消未完成加载时图片默认展示(避免多次变化图片时显示初始图片体验下降)

resize:自定义图片大小

onlyScaleDown:与resize配合使用,如果加载的大小比resize大,那么直接加载resize大小,不再重新计算

centerCrop:与resize配合使用,图片会被剪切,但是图片质量看着没有什么区别

centerInside:与resize配合使用,图片会被完整的展示,可能图片不会填充满ImageView`,也有可能会被拉伸或者挤压

fit最佳显示图片,减少内存,不影响图片质量

priority:设置图片加载优先级,默认是先加载较小的图片,但如果需要按顺序加载,需要设置优先级(Picasso.Priority.HIGH/MIDDLE/SMALL 默认MIDDLE)

tag:传递的值是当前的上下文,在一个ListView的子item中加载一张图片是很常见的,这些图片都来源于网络请求,如果这个listview有上千条数据,当用户快速滑动的时候,每个item会不断的被复用,当然Picasso的请求也不断地进行请求,取消请求,再次请求,再次取消的操作(对屏幕外的自动取消请求),添加tag,可以在用户在快速滑动的时候全部停止请求,只有在滑动停止时再去请求。

需要设置listview的scrolllistener,在滚动发送变化的时候对图片的请求统一做处理。

上下文默认会获取全局ApplicationContext,即使传递的是activity,也会去获取全局ApplicationContext

picasso支持自定义notification的使用

fetch taget get 参考连接


教程四

rotate:对图片进行旋转

transform:支持自定继承Trasformation,实现加载图片的不同效果

memoryPolicy:负责内存缓存

NO_CACHE:让Picasso跳过从内存中读取图片这一操作

NO_STORE:如果你的图片只加载一次就没用了,就调用该值,这样的话Picasso就不会在内存及本地进行缓存了

networkPolicy:负责本地缓存

NO_CACHE:让Picasso跳过从本地读取资源这一过程

NO_STORE:让Picasso不进行本地图片缓存

OFFLINE:让Picasso加载图片的时候只从本地读取除非联网正常并且本地找不到资源的情况下

内部遵从最近最少使用算法。

setIndicatorsEnable:设置为true时,可以在加载的图片左上角看到一个小三角(绿色代表内存获取,蓝色代表本地获取,红色代表网络加载)

根据颜色的提示,测试结果表明,memoryPolicy和networkPolicy建议一起使用

两个都NO_CACHE和NO_STORE时,网络获取,两个都NO_CACHE,网络获取。

两个都NO_STORE,内存获取。

什么都不加,内存或本地,看你性能了。


另外po一下别人爬的缓存位置的链接:http://blog.csdn.net/u014592587/article/details/47070075

cache: /data/data/package-name/cache/picasso-cache

file:/data/data/package-name/files/

cache的目录是通过Utils中的createDefaultDir函数找到的,运行后发现该目录下还有files应该是本地缓存的地址,不过这个文件只找到了一个Instant-run,本地怎么缓存还没有完全理解。

自定义缓存地址:

上面的链接有写,不过编译的时候没通过,因为找不到okHttpClient,我看了一下jar里面是没有这个类的,只在pom.xml里面申请了,所以只能暂时认为是环境连不上谷歌还是什么的,反正工作环境这边用as都必须使用jar包,不能直接在manifest.xml里面写网址申明,有研究的麻烦回答一下o((⊙﹏⊙))o.

怎么删除缓存?

一种方式是:

Picasso.with(getActivity()).invalidate(file);
file默认picasso用之前那个缓存的地址,如果是自定义的话,用自定义的地址。 测试下来,我在ondDestory的地方清了一次,然后,picasso-cache目录下的文件并没有减少。

另一种

链接:http://stackoverflow.com/questions/27502659/clear-cache-memory-of-picasso

这个是设置memoryPolicy是NO_CACHE和NO_STORE,onDestory的时候检查目录依旧文件没有减少,不过三角标志保持是蓝色,也就是本地加载,所以内存是肯定没有了(因为压根就跳过了内存读取和保存),总而言之picasso的缓存是个谜,怎么删干净也是个谜。让我们姑且相信底层的okHttp(没起来),HttpUrlConnection能够处理好缓存的问题,还有他的最近最少使用算法。


教程五

参考:http://blog.csdn.net/smallcheric/article/details/51056212

自定义picasso相关

DownLoader相关

自定义URI请求


部分源码解析

参考:http://blog.csdn.net/SmallCheric/article/details/51061853

介绍和加载图片语句

 Picasso.with(content).load(url).into(imageView);
相关的三个部分with(content)、load(url)、into(imageView)

with(content)基于单例模式和建造者模式,初始化了流程和一些必须创建的类

缓存使用了LinkedHashMap,划分最大堆内存值的百分之15,每次调用set方法进行缓存都会计算当前可使用大小,超出范围会删掉之前保存的数据。

线程池默认wifi下为4个线程,4G状态为3个线程,3G状态下为2个线程,2G状态下为1个线程.


自定义和源码部分还未理解,未完待续。。。


你可能感兴趣的:(Android)