picasso是Square公司开源的一个Android图形缓存库,地址http://square.github.io/picasso/,可以实现图片下载和缓存功能。

picasso有如下特性:

  • 在adapter中回收和取消当前的下载;
  • 使用最少的内存完成复杂的图形转换操作;
  • 自动的内存和硬盘缓存;
  • 图形转换操作,如变换大小,旋转等,提供了接口来让用户可以自定义转换操作;
  • 加载载网络或本地资源;
  • 可以转换为自己需要的request(Square公司开源的另一个网络支持库:retrofit支持转化json,protocol buffers).

1.picasso的简单使用

 Picasso.with(context).load(url).placeholder(R.drawable.pic).error(R.drawable.pic).into(tagert);
需要注意:url为http链接时,load(url),当url为本地图片路径时load(new File(url)). 需要对图片简单处理:transform(Transformation);
如下是显示圆形图片
//重载函数
public Bitmap transform(Bitmap source) {
int width = source.getWidth();
int height = source.getHeight(); int x = 0, y = 0;
if (mSquareRound && width != height) {
if (width < height) {
y = (height - width)/2;
} else {
x = (width - height)/2;
}
width = height = Math.min(width, height);
Bitmap tempSource = Bitmap.createBitmap(source, x, y, width, height);
source.recycle();
source = tempSource;
} Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Paint paint = new Paint();
paint.setDither(true);
paint.setAntiAlias(true);
BitmapShader shader = new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint.setShader(shader);
Canvas canvas = new Canvas(output); final RectF bounds = new RectF(0, 0, width, height);
canvas.drawOval(bounds, paint);
source.recycle();
return output;
}
transform(new RoundTransformation(true));

2.picasso的类图如下:

关键类的简单介绍:

Cache:缓存类,子类LruCache才采用Least Recently Used 近期最少使用算法,当然LinkedHashMap已实现这个策略,只需根据配置的缓存大小来trimToSize。

picass缓存策略单一,没有另一个图片下载缓存库Android-universal-Image-Loader 缓存策略丰富:FIFOLimitedMemoryCache ,LimitedAgeMemoryCache 等。

而本地文件缓存,picasso引用okhttp的文件缓存,而Android-universal-Image-Loader也不同几种文件缓存策略。

RequestCreator:Requst构建者,可以通过不同参数配置request请求。

Request:请求封装类,之后把所有对图形的操作都会记录在这里,供之后图形的创建使用,如重新计算大小,旋转角度,也可以自定义变换,只需要实现Transformation,一个bitmap转换的接口。传到另一个结构中Action。

Action:Action代表了一个具体的加载任务,主要用于图片加载后的结果回调,有两个抽象方法,complete和error.来通知上层。

BitmapHunter:一个runnable线程,网络下载工作线程,交给ExecutorServer管理执行。

Downloader:网络图片下载器,子类不同来选择http client。

RequestHandler:请求处理类,子类根据图片来源获取资源。

Dispathcer:任务调度器,调度和维护者actions 和 bitmapHunter,当bitmaphunter获取到图片时,会转给dispather,发送异步消息,最终会转到action.complete()或者action.error().

3.picasso.with(context).loar(http).into(imageview);流程图如下

网上找到一个一张很好的picasso流程分析图:http://www.happyhls.me/blog/2014/11/27/picasso%E6%BA%90%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90%EF%BC%9A5%E3%80%81picasso%E6%9E%B6%E6%9E%84%E5%88%86%E6%9E%90/

要点:

1在into(target).中做了是否在UI主线成操作,由于要显示默认的图片,得保证在主线程中对ui操作。

2.Dispather本质上可以看成一个线程,action提交和请求结果的回调都是在DispatcherThread线程中通过DispacherHandler处理。

3.picasso中通过广播监控网络状态,来动态改变PicassoExecutorService中线程数量。

4.picasso单例的思考:picasso构建时,初始化了cache,注册了监听网络状态的广播等,在调用shutDown()方法中做了cache清空和注销广播工作,但是,对于这个全局picasso在什么时机做清理工作了(显式调用shutdown()),这个时机不好把握,除非app能够自身监听application被关闭,回调shutdown.如果不显式调用shutdown,cache没有清空,广播就没有注销。对于context.registerReceiver(),context可能是application,可能是activity(在ams,在activity被destory过程会隐式调用unregisterReceiver()或unbindService()),对于context是application没有隐式注销unregisterReceiver(),可能存在潜在问题(内存泄露会不会出现了);如果想对每个activity拥有个picasso,则可以使用

Picasso.Builder(context).build();这样可以在每个activity中ondestory中显式调用picasso.shutdown();

5.BitmapHunt.hunt()中,,同一时刻,仅允许一张图片进行解码,加了同步安全,进行Transformation,防止oom.

4.使用picasso可能出现的问题:

1.图片有时会显示不了,查看应用中图片缓存文件,对一张图片,会生成两个文件:,.0文件保存了http响应相应的信息,.1文件时加密后的图片文件。.0文件的内容如下:

http://192.168.2.40:82/group1/M00/0A/60/wKgCKFQJQkKABEn9AAPhsEdiW-o.phpzqf
GET
0
HTTP/1.1 200 OK
9
Server: nginx/1.2.6
Date: Tue, 16 Sep 2014 12:02:26 GMT
Content-Length: 254384
Last-Modified: Fri, 05 Sep 2014 04:55:30 GMT
Connection: keep-alive
Accept-Ranges: bytes
OkHttp-Selected-Protocol: http/1.1
OkHttp-Sent-Millis: 1410868547182
OkHttp-Received-Millis: 1410868547357

这边出现问题时,Content-Length: 0,但是图片确实存在。如果出现有时显示不了,可以从这方面查看下。可行的方法:

定制Downloader,配置缓存目录和缓存大小。

2.当picasso显示列表中大量图片时,查看大图时,有时还是会出现oom,除了对长宽比压缩,也可以以另外一个进程查看大图。

android开源项目:图片下载缓存库picasso的更多相关文章

  1. 毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选

    毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.i ...

  2. picasso_强大的Android图片下载缓存库

    tag: android pic skill date: 2016/07/09 title: picasso-强大的Android图片下载缓存库 [本文转载自:泡在网上的日子 参考:http://bl ...

  3. [转]Android开源项目第二篇——工具库篇

    本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多 ...

  4. Android开源项目第二篇——工具库篇

    本文为那些不错的Android开源项目第二篇——开发工具库篇,**主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容 ...

  5. picasso-强大的Android图片下载缓存库

    编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! pica ...

  6. Android开源项目大全之工具库

    http://www.neast.cn/forum.php?mod=viewthread&tid=5487&fromuid=5

  7. 2015-2016最火的Android开源项目--github开源项目集锦(不看你就out了)

    标签: Android开发开源项目最火Android项目github 2015-2016最火的Android开源项目 本文整理与集结了近期github上使用最广泛最火热与最流行的开源项目,想要充电与提 ...

  8. Android开源项目分类汇总

    目前包括: Android开源项目第一篇——个性化控件(View)篇   包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView. ...

  9. GitHub上史上最全的Android开源项目分类汇总 (转)

    GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...

随机推荐

  1. HTML入门学习笔记

    1.html文件的基本架构 <HTML> <HEAD> <TITLE> 网页的标题 </TITLE> </HEAD> <BODY> ...

  2. Spring- 异常org.xml.sax.SAXParseException; systemId: http://www.springframework.org/schema/context/; lineNumber: 1; columnNumber: 55; 在 publicId 和 systemId 之间需要有空格。

    抛出异常 六月 03, 2018 7:40:44 下午 org.springframework.context.support.AbstractApplicationContext prepareRe ...

  3. Linux下c++11多线程聊天室

    刚看的c++11多线程,写个聊天室试试编译的时候加上 c++11 和 多线程库g++ -Wall -std=c++0x -pthread -o server server.cppserver 和cli ...

  4. 英语发音规则---oo

    英语发音规则---oo 一.总结 一句话总结: 1.重读音节词尾的字母组合oo发音素[u:]的音? too [tu:] adv.太;也 zoo [zu:] n.动物园 room [ru:m] n.房间 ...

  5. delphi完美经典-第16章 Delphi数据库程序设计----使用BDE组件

    第16章 Delphi数据库程序设计----使用BDE组件 Delphi访问数据库的方式有:ADO.BDE.dbExpress.InterBase Express. 一.TDataSet组件 虽然De ...

  6. node.js+express+jade系列六:图片的上传

    安装npm install formidable 先把文件上传到临时文件夹,再通过fs重命名移动到指定的目录即可 fs.rename即重命名,但是fs.rename不能夸磁盘移动文件,所以我们需要指定 ...

  7. Agc011_F Train Service Planning

    先放题面,再放LHX巨佬题解 接着就是%%%.$orz.Oro.Or2.Otz.OTL.sto.rzo.Jto$.On_.○| ̄|_啊 模拟赛里直接把这道题刚掉了 一题升天·爆踩全场 这题思维跨越度已 ...

  8. 霍夫变换Hough

    http://blog.csdn.net/sudohello/article/details/51335237 霍夫变换Hough 霍夫变换(Hough)是一个非常重要的检测间断点边界形状的方法.它通 ...

  9. iOS使用NSURLSession发送POST请求,后台无法接受到请求过来的参数

    iOS中发送POST请求,有时需要设置Content-Type,尤其是上传图片的时候. application/x-www-form-urlencoded: 窗体数据被编码为名称/值对.这是标准的编码 ...

  10. C/C++面试题总结(2)

    C++部分: 1.static(静态)变量有什么作用? 2.virtual关键字用法 3.const有哪些作用 或<王道程序员求职宝典>P95 4.new/delete与malloc/fr ...