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. linux安全相关

    2017-05-11突然谈到linux安全相关的话题,记录一下 搜了一下,找到一篇介绍apparmor和selinux的文章 http://www.361way.com/apparmor-selinu ...

  2. C/C++ 库函数 是否调用 WinAPI

    1. 跟了一个函数 fopen,简单测试代码为: #include<stdio.h> #define F_PATH "e:\\Z.txt" int main(void) ...

  3. CSS: iPhone Custom CSS

    1. [代码][CSS]代码 <style type="text/css" media="screen"> /* iPhone 4@media on ...

  4. cocos2d-x3.0rc打包apk遇到的一些问题记录

    下载cocos2d-x3.0rc后根据官方教程进行环境配置等等一系列过程没有遇到什么问题 打包apk时出现一些问题: 按照官方教程cmd下运行cocos run -p android -m relea ...

  5. python3与Redis连接操作

    Python3之redis使用   简介 redis是一个key-value存储系统,和Memcache类似,它支持存储的value类型相对更多,包括string(字符串),list(链表),set( ...

  6. 理解WCF(第二部分,部分參考他人)

    該篇的主題:wcf到底是怎工作的? 一.什么是分布式: 首先看一张图: 由上图对比我们可以发现,区别就是前者把服务器放在了一台电脑上,而后者把服务器放在了多台电脑上.这样多台电脑处理起来的速度比一台电 ...

  7. Python基础-常用模块OS

    模块:一个python文件就是一个模块,模块分三种: 1,标准模块,也就是python自带的模块,例如import  time,random,string等等 2,第三方模块,这种模块需要自己安装才能 ...

  8. C++0X 学习之 auto

    auto并不是一个新关键词,是一个把旧关键词赋予新的作用,新的作用修饰变量声明,指示编译器根据变量的初始化表达式推导变量应有的类型.auto 声明的变量必须“在声明处完成初始化”,编译器才可根据初始化 ...

  9. ffmpeg用法(心得体会还有你见过的用法)

    ffmpeg的常用用法很多,我这里提供的用法有可能有许多地方是你没见过的. 一.ffmpeg合并视频 我经常需要切割再把一些零碎的视频给拼接起来,这样可以省许多磁盘空间.其实用mencoder挺不错的 ...

  10. ASP里面令人震撼地自定义Debug类(VBScript)

    不知道用ASP写代码的朋友是不是和我有一样的感受,ASP中最头疼的就是调试程序的时候不方便 我想可能很多朋友都会用这样的方法“response.write ”,然后输出相关的语句来看看是否正确.前几天 ...