android开源项目:图片下载缓存库picasso
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的更多相关文章
- 毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选
毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.i ...
- picasso_强大的Android图片下载缓存库
tag: android pic skill date: 2016/07/09 title: picasso-强大的Android图片下载缓存库 [本文转载自:泡在网上的日子 参考:http://bl ...
- [转]Android开源项目第二篇——工具库篇
本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多 ...
- Android开源项目第二篇——工具库篇
本文为那些不错的Android开源项目第二篇——开发工具库篇,**主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容 ...
- picasso-强大的Android图片下载缓存库
编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! pica ...
- Android开源项目大全之工具库
http://www.neast.cn/forum.php?mod=viewthread&tid=5487&fromuid=5
- 2015-2016最火的Android开源项目--github开源项目集锦(不看你就out了)
标签: Android开发开源项目最火Android项目github 2015-2016最火的Android开源项目 本文整理与集结了近期github上使用最广泛最火热与最流行的开源项目,想要充电与提 ...
- Android开源项目分类汇总
目前包括: Android开源项目第一篇——个性化控件(View)篇 包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView. ...
- GitHub上史上最全的Android开源项目分类汇总 (转)
GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...
随机推荐
- WebSocket实现Web聊天室
一.客户端: JS代码如下: /* * 这部分js将websocket封装起来 */ var websocket = null; //判断当前浏览器是否支持WebSocket if ('WebSock ...
- java的远程访问接口的实例
被别人远程调用和自己远程调用别人接口的理解: 被别人调用接口:其实没有什么神秘的,就是我们写一个正常的方法提供一个访问路径. 调用别人的接口:本质时一个Request请求,实际要使用到javax.ne ...
- matlab之fliplr()函数
fliplr 左右翻转矩阵 语法: B = fliplr(A) 将矩阵A的列绕垂直轴进行左右翻转 matabc 如果A是一个行向量,fliplr(A)将A中元素的顺序进行翻转. 如果A是一个列向量, ...
- 带SoapHeader验证的WebServices
一般在项目中,制作的都是基于SOAP协议的webservices,其描述语言是WSDL.但是有时候在项目中,需要保证webservices的安全,需要对其进行进行验证,那么我们就要实现SoapHead ...
- 图像处理检测方法 — SIFT和SURF
0.特征与匹配方法总结汇总对比 参考网址:http://simtalk.cn/2017/08/18/%E7%89%B9%E5%BE%81%E4%B8%8E%E5%8C%B9%E9%85%8D/#ORB ...
- python-字典和json
Python的字典和JSON在表现形式上非常相似 #这是Python中的一个字典 dic = { 'str': 'this is a string', 'list': [1, 2, 'a', 'b'] ...
- 几个常用的url生成二维码的接口
找到了几个URL生成的接口,速度上可能会有差别,可试验后选用,我用过第一个,分享: <!doctype html> <html lang="en"> < ...
- python模块inspect.py
inspect模块用来检查对象的类型(函数,属性,类,抽象基类,方法,模块等等) 是一个封装好的非常有用的模块. ]) ]: cls = :]: content = ] = lines[].lstri ...
- Arc065_E Manhattan Compass
平面上有$N$个点$(X_i\space, Y_i)$,定义$D(a,b)=|X_a-X_b|+|Y_a-Y_b|$. 如果你当前在$(p,q)$,这个无序二元组(即$(p,q)$和$(q,p)$被认 ...
- .net Core 2.1 MVC+EF+Redis搭建
官方学习资料 搭建空MVC框架 1.创建一个空模板 2.创建文件夹 Controllers.Models.Views 3.在Controllers文件夹下创建HomeController.cs 选择C ...