android开源项目:图片下载缓存库picasso

来源:互联网 发布:星际淘宝网起点 编辑:程序博客网 时间:2024/04/30 15:43

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

picasso有如下特性:

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

1.picasso的简单使用

复制代码
1 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);流程图如下

 

 

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

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

复制代码
http://192.168.2.40:82/group1/M00/0A/60/wKgCKFQJQkKABEn9AAPhsEdiW-o.phpzqfGET0HTTP/1.1 200 OK9Server: nginx/1.2.6Date: Tue, 16 Sep 2014 12:02:26 GMTContent-Length: 254384Last-Modified: Fri, 05 Sep 2014 04:55:30 GMTConnection: keep-aliveAccept-Ranges: bytesOkHttp-Selected-Protocol: http/1.1OkHttp-Sent-Millis: 1410868547182OkHttp-Received-Millis: 1410868547357
复制代码

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

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

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

1 0
原创粉丝点击