Volley与Picasso的对比

想写一篇文章来对比一下Volley以及Picasso,有人或许会说了,Volley和Picasso的服务对象都不同,Picasso是专注于图片的下载以及处理,而Volley则适应于任何轻量的网络请求。是的,的确如此,那我们不如就图片下载缓存这个应用场景展开来,来对比分析Volley和Picasso的相同之处与不同之处。

首先我们先来看一下Volley和Picasso的整体框图。

Volley:

Picasso:

Picasso-整体架构

其中Volley是官方给出的整体框架图,而Picasso是我自己根据源代码抽离出来的,可能有些地方不是那么准确,请大家指教。先说一下从上面两张框架图对比,发现的其中的不同之处:

对请求对象的封装不同:

在Volley中,请求会直接封装在Reqeust当中,包括目标的网址/回调的接口等等信息,直接提交给CacheDispatcher即可。
在Picasso中,一个请求会依次封装成ReqeustCreator,Reqeust,Action等不同状态,其中ReqeustCreator是用于创建Reqeust,在ReqeustCreator中可以设置图片的地址,大小,是否居中,是否旋转,图片的后处理等等参数,通过ReqeustCreator中拥有一个RequestBuilder对象;当用户调用into(Target)方法的时候,通过RequestBuilder中的build()方法,会构造出Reqeust,然后构造出对应的Action方法,提交至Dispatcher队列进行处理。

Dispatcher不同:

在Volley中,Dispatcher包括CacheDispatcher和NetworkDispatcher两部分,其中CacheDispatcher只有一个线程,而NetworkDispatcher默认会有4个线程在执行。
在Picasso当中,所有的任务的分发都是通过一个Dispatcher,即DispatcherThread工作线程来完成。

消息的传递方式不同:

当添加任务的时候:
Volley是通过阻塞队列实现,所有的Dispatcher(包括CacheDispatcher和NetworkDispatcher)。
Picasso添加任务是通过Handler,将Action作为消息的Message中的object的进行传递。
当任务结束,发送消息的时候:
Volley是通过Handler实现,但不会在消息中传递具体的任务,而是负责发送消息,并使用handler.post()方法将要执行的代码发送到主线程上执行。
Picasso是将任务的包装类BitmapHunter作为Message的object来进行传递。

Cache

MemoryCache

Volley中,对于普通的任务,并没有设定MemoryCache,我理解的这是因为Volley的设计初衷是用于那些轻量级的网络访问,一般不会占用太大内存,所有不需要再使用MemoryCache,使用DiskBasedCache,性能也能满足。而服务于图片的ImageLoader,其中明确要求我们实现一个MemoryCache以供使用。
Picasso由于其设计服务对象就是图片,因此其本身自带的Cache就是MemoryCache

DiskCache

Volley中默认实现的Cache就是DiskBasedCache,根据网络请求结果根据情况保存在Cache当中。
Picasso其本身并不支持DiskCache,但根据我在StackOverflow查到的结果,有网友说,其DiskCache依赖于其网络库,默认的为Square自己的OKHttp,okhttp内部已经实现有网络Cache,未考察(参考:stackoverflow)。

支持的请求来源不同:

Volley仅支持从网络上访问图片或者其他的资源。
Picasso支持从网络,File,Resource,Asserts中加载图片。

支持的请求对象不同:

Volley支持图片,Json,String等等各种各样的网络请求,而且可以很容易的扩展自己的实现。
Picasso仅仅支持图片。

任务优先级的支持:

Volley支持任务的优先级
Picasso没有任务的优先级这一说

图片后续处理的支持:

Volley不支持通过注册函数的方式实现图片的后处理,仅仅可以在收到请求完成的回调之后,自己进行图片的后处理。
Picasso可以通过注册Transformer的形式,对获取的图片进行后续处理,完成之后再通知完成动作。参考:Picasso的使用:使用Transformation,下载后预处理图片并显示

任务的暂停:

Volley不支持
Picasso支持,通过调用Picasso中的pauseTag(Object tag)实现

说完不同的,再来看看Volley和Picasso在设计的时候都考虑到的地方,这也是在我们需要设计自己的图形缓存库的时候,更加需要注意到的地方:

主线程仅负责任务的添加和完成时的回调,其他的任务又其他线程负责处理

老生常谈了,主线程不能做太多的事情,否则ANR有好看的。

允许多个任务同时进行处理

多个线程是优化效率的一种特别有效的手段,比如多个任务同时进行的时候,可以同时下载,提高效率。
###根据不同的网络情况,按需调整或者重新设置同时工作线程数目:
Volley和Picasso当中,都根据网络状态的不同,规定了不同的同时进行的网络请求数目,既能充分利用网络,又不至于榨干系统网络请求资源。 这个地方是我之前理解有错误,在默认情况下,Picasso是可以根据网络的不同设置不同的网络请求并发数目,但实际上Volley中并不存在这个功能,其默认newRequestQueue生成的ReqeustQueue其指定的并发数目为4,因此如果有需要,需要自己手动编写一层封装,以实现根据网络状态设置工作线程数目的目的。感谢千醉z。

要有Cache

分为MemoryCache和DiskCache,MemoryCache不多说了,对于图片来说,必须要有的,要不频繁解码,容易OOM不说,解码消耗的大量时间,用户体验也会很差。

支持批量任务的添加、删除、暂定

比如当一个Activity退出的时候,总要有办法能够同时取消该Activity对应的所有的网络请求的。

避免OOM

同一个时刻,仅仅允许一张图片进行解码操作,这个Picasso是从Volley中学来的。

大体上就想到这些,总体上,如果我们的需求仅仅需要处理图片,那么Picasso在功能上可以说远远要优于Volley,是我们的第一选择,但如果我们图片的需求并不是特别强烈,同时还在网络上传输一些数据,那么Volley可能更加适合。如果大家有别的看法,一起讨论。

转载:https://blog.happyhls.me/2014/11/27/volley%E4%B8%8Epicasso%E7%9A%84%E5%AF%B9%E6%AF%94/

Volley与Picasso的对比的更多相关文章

  1. Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比

    比较的指标: 1.cpu 2.流量 3.电量 4.内存占用 5.联网时间 功能点: 1.重试机制 2.提供的扩展功能 3.易用性 4.是否https 5.是否支持reflect api,OkHttp有 ...

  2. 59.Android开源项目及库 (转)

    转载 : https://github.com/Tim9Liu9/TimLiu-Android?hmsr=toutiao.io&utm_medium=toutiao.io&utm_so ...

  3. Android开源项目及库搜集

    TimLiu-Android 自己总结的Android开源项目及库. github排名 https://github.com/trending,github搜索:https://github.com/ ...

  4. 各种Android UI开源框架 开源库

    各种Android UI开源框架 开源库 转 https://blog.csdn.net/zhangdi_gdk2016/article/details/84643668 自己总结的Android开源 ...

  5. 收藏的技术文章链接(ubuntu,python,android等)

    我的收藏 他山之石,可以攻玉 转载请注明出处:https://ahangchen.gitbooks.io/windy-afternoon/content/ 开发过程中收藏在Chrome书签栏里的技术文 ...

  6. android 实现类似微信缓存和即时更新好友头像

    引言 使用微信时我们会发现,首次进入微信的好友列表时,会加载好友头像,但是再次进入时,就不用重新加载了,而且其他页面都不用重新加载,说明微信的好友头像是缓存在本地的,然后好友修改头像后,又会及时的更新 ...

  7. Android 学习笔记之AndBase框架学习(三) 使用封装好的函数完成Http请求..

    PS:踏踏实实走好每一步... 学习内容: 1.使用AndBase框架实现无参Http Get请求... 2.使用AndBase框架实现有参Http Post请求... 3.使用AndBase框架实现 ...

  8. Android开发优化宝典

    I. 网络相关 http头信息带Cache-Control域 确定缓存过期时间 防止重复请求 直接用IP直连,不用域名,策略性跟新本地IP列表. – DNS解析过程耗时在百毫秒左右,并且还有可能存在D ...

  9. 【Android - 框架】之Glide的使用

    一.Glide简介: Glide是Google官方推荐的一个图片加载和缓存的开源库,它不仅能实现平滑的图片列表滚动效果,还支持远程图片的获取.大小调整和展示,并且可以加载GIF图片.Glide相比与U ...

随机推荐

  1. linux 中C语言便于调试的宏定义编写及 __FILE__,__FUNCTION__, __LINE__参数使用

    转自:http://blog.csdn.net/edonlii/article/details/8491342/ 在linux编程中,当文件数量变的众多之后,使用gdb调试就是一场灾难.因此在程序中加 ...

  2. JS---猜数字(0-100)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. Windows平台Python编程必会模块之pywin32

    在Windows平台上,从原来使用C/C++编写原生EXE程序,到使用Python编写一些常用脚本程序,成熟的模块的使用使得编程效率大大提高了. 不过,python模块虽多,也不可能满足开发者的所有需 ...

  4. ceph安装对象网关

    1.概述 安装3个网关节点分别是:controller-03.controller-04和controller-05,使用ceph gw自带的Civetweb提供服务,前端使用nginx作为前端代理. ...

  5. SoapUI登录测试(2)-- 断言

    SoapUI登录测试(1)的结果为: 可以看到只有第2步是成功的,1.3的结果是unKnown,这里并没有对1.3两步添加断言,判断testCase中的这2步是否通过. 一.添加断言 1. /logi ...

  6. Eclipse插件:tomcatPluginV33.zip 安装

    一.下载 地址:http://www.eclipsetotale.com/tomcatPlugin.html 二.安装 1.解压tomcatPluginV33.zip到Eclipse的\feature ...

  7. JavaScript高级程序设计学习笔记第十四章--表单

    1.在 HTML 中,表单是由<form>元素来表示的,而在 JavaScript 中,表单对应的则是 HTMLFormElement 类型. HTMLFormElement 继承了 HT ...

  8. pythonDB api的学习

    有时候需要操作数据库,为了能使用统一的接口访问,我们采用Python DB API,地址为 https://www.python.org/dev/peps/pep-0249/ 全文参考---“疯狂的蚂 ...

  9. Ubuntu 14.04中修复默认启用HDMI后没有声音的问题

    声音问题在Ubuntu中是老生常谈了.先前我已经在修复Ubuntu中的“无声”问题一文中写到了多种方法,但是我在此正要谈及的声音问题跟在另外一篇文章中提到的有所不同. 因此,我安装了Ubuntu 14 ...

  10. CSS 绝对定位与相对定位的区别

    设置为绝对定位的元素框从文档流完全删除, 并相对于其包含块定位,包含块可能是文档中的另一个元素或者是初始包含块. 元素原先在正常文档流中所占的空间会关闭,就好像该元素原来不存在一样. 元素定位后生成一 ...