Google I/O 2013: Volley加载图片添加缓存处理

google i/o 2013已经结束,它让我们对android将来的发展有了更大的期待。今年i/o大会上展示的令人激动的创新之一是名为volley库。volley是一个处理并缓存网络请求的库,它把开发者从不同的应用中编写相同代码的泥潭中拯救出来。编写相同代码从来都不是有趣的,还会增加开发者的错误几率。正式考虑了这一点,google创造了volley。
如果你没有看google i/o 上介绍volley的视频,我建议你先去看一下,在对它有了基本了解后再继续后面的文章。
通过google i/o介绍,ficus kirpatrick谈论了许多volley如何有助于加载图片的内容。当使用volley作为你的图片加载解决方案时,你会发现,尽管它自己处理l2缓存,它请求但不包含一个内存不足的l1图片缓存。很多人已经使用过例如universal image loader或square’s newer picasso library来处理图片缓存;然而,这些库通常只处理图片的加载和缓存。那么,我们如何使用volley替代它们来加载和缓存图片呢?首先,让我们看看volley提供的加载功能,缓存功能稍后再讲。
imageloader
imageloader类需要一个请求的实例以及一个imagecache类的实现。图片通过传递一个url和一个imagelistener实例到get()方法进行加载。从那里,imageloader检查imagecache,如果图像不是在缓存中,就从网络中加载图片。
networkimageview
这个类代替布局中的imageviews类而且使用imageloader类。networkimageview类的seturl()方法需要一个url路径字符串和一个imageloader实例。然后,它使用imageloder的get()方法来取回图片数据。
java
1
2
3
4
5
6
7
8
imagecache
volley库的imagecache接口允许你使用你喜好的l1缓存实现。不幸的是,volley的缺点之一,没有默认的缓存实现。i/o大会上演示了一个bitmaplrucache的代码片段,但库本身没有包含任何实现。
imagecache接口有两个方法,getbitmap(string url)和putbitmap(string url, bitmap bitmap)。这些桩是非常简单的,它们可以添加到任何缓存实现里。
填补空白:向volley增加一个图片缓存
例如,我已经创建了一个简单的应用,该应用通过twitter搜索”captech”,并在一个列表视图中显示搜索到的结果,每一列包含用户名和图片。当向下滑动时,这个列表会自动加载旧的记录,还会从缓存中获取图片。
captech
有两种可用的缓存实现。推荐的方法是在内存中使用一个基础的lru缓存。对于硬盘的缓存实现,我选择使用jack wharton编写的disklrucache。我选择这个实现是因为它在android社区中被频繁的使用,并且有人提供了一个改造自己的应用来适配volley的用例。使用一个基于磁盘的l1缓存可能导致阻塞i/o问题。volley已经有一个隐式的硬盘l2缓存。硬盘l1缓存已经被包含在内了,因为我最初并没有察觉volley如果处理图片请求缓存。
以下是这个实现的主要组件:
requestmanager
requestmanager维护我们的requestqueue的一个引用。volley使用resuestqueue来处理我们对twitter数据和图片加载的请求。
gsonrequest
gsonrequest与图片加载没有直接联系,但它代表了如何扩展volley请求类来处理json解析。该类用于对twitter的get请求和twitterdata对象的结果。
bitmaplruimagecache
该类是一个基本的“最近最少使用(lru)”内存缓存实现。它速度快但不会阻塞i/o。这是推荐的方法。
disklruimagecache
disklruimagecache是一个位图版本的disklrucache封装。它从disklrucache中增加并检索位图,还处理缓存的实例化。硬盘缓存可能阻塞i/o。
imagecachemanager
imagecachemanager持有imagecache和volley imageloader引用。
在imagecachemanager中,你可能注意到一点就是我们使用url字符串的hashcode()作为缓存的键值。这是由于url中的某些字符不能作为缓存的键值。
buzzarrayadapter
该适配器比较简单的。这里只需要注意一点,我们要实现volley的listener和errorlistener接口,并且把该适配器作为listener参数传递给了networkimageview 的seturl(string string , listener listener, errorlistener errorlistener)方法。这个适配器包含了一些额外代码用于滚动时加载旧的tweets。
java
1
2
3
4
5
6
7
8
tweet tweet = mdata.get(position);
if(tweet != null){
viewholder.twitteruserimage.setimageurl(tweet.getuserimageurl(), imagecachemanager.getinstance().getimageloader());
viewholder.usernametextview.settext(@ + tweet.getusername());
viewholder.messagetextview.settext(tweet.getmessage());
viewholder.tweettimetextview.settext(formatdisplaydate(tweet.getcreateddate()));
viewholder.destinationurl = tweet.getdestinationurl();
}
信息汇总
有了所有这些部分,图像加载和缓存现在变得非常简单。启动时,应用程序在mainapplication类中初始化requestmanager和imagecachemanager类。这里你可以声明你期望的l1缓存类型。默认实现是内存缓存。
在mainactivity中,我们首次调用twittermanager并加载初始数据。一旦我们接收到返回数据,我们将它传递给buzzarrayadapter,并且把buzzarrayadapter设置到listview中。
在以上的buzzarrayadapter代码中,networkimageview承担了所有繁重的图片加载操作,我们只需要将从imagecachemanager得到的实例传达给图片加载器就可以了。
imagecachemanager检查我们的lru缓存实现,并返回可用的图片。如果图片不在缓存中,它就会到网络中获取。
当你滚动listview时,buzzarrayadapter会加载更多的tweets和相应的图片,并重用已经在缓存中的图片。
结束时的思考
尽管volley是用处大、速度快、容易实现;但现在还不是使用它的时候,原因如下:
这个库缺少任何说明文档和使用用例。
例如缓存配置组件,还不具有我期望的高可配置性。
如上所见,排除基本图片缓存实现看起来很奇怪。可能包含一个noimagecache实现也许更加有用,或者使缓存变得可配置以满足只从网络上获取所有信息的需求。
在开发者社区有很多与volley而令人激动的消息。给人的感觉是这个库应当已经被作为android api,并且被引入了很长时间了。就像在i/o大会上宣布的新的location api 那样。很显然,google正在致力于通过移除一些对app开发的阻碍,从而使得开发者的生活变得更加轻松。

骨传导蓝牙耳机哪个牌子好,不用塞进耳朵的蓝牙耳机
我国无人车商用已经进入到实质性阶段,无人驾驶汽车产业热点已经形成
太阳能路灯有辐射吗_太阳能路灯优缺点
华为智能机销量疯狂增长,拉动半导体消费新高峰
小米6无边框、前置双摄像头、高配置设计,这是要吊炸天的节奏
Google I/O 2013: Volley加载图片添加缓存处理
三相四线制供电,三相负载平衡,为什么零线电流大于火线电流?
美国限制华为使用美国技术,联发科3000万套芯片打水漂
电磁加热控制器的正确使用方法
2016年终盘点:智能家居行业那些“一纸婚约”
鸿蒙上实现“数字华容道”小游戏
未来区块链将在更多领域得到应用
为什么要检测泄露电流_泄露电流的检测方法
云存储服务技术架构及云存储服务的优势
ATmega3208系列MCU物联网解决方案
如何用废旧电器改造德生BCL2000收音机
图解锂电隔膜
西门子博途编译步骤说明
南京抽查护眼灯产品:合格率93.3%
工业自动化的改造方式与途径,我们该如何做