预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

基于Volley和DiskLruCache的缓存策略 在我们开发应用过程中,不可避免的使用网络图片,那么图片请求和缓存就成了一个问题,本着为用户节省流量的角度,我们的应用就应该是已经下载的图片不会重复下载,以及下载过的图片没有网络也能查看的效果,这里就涉及到了网络请求、内存缓存和磁盘缓存。简单的介绍一下今天的两位主角:HYPERLINK"https://github.com/JakeWharton/DiskLruCache"DiskLruCache:是基于Lru磁盘缓存的Java实现。 HYPERLINK"https://android.googlesource.com/platform/frameworks/volley"Volley:Google推出的Android异步网络请求框架和图片加载框架(自备梯子)。 细心的小伙伴应该发现咋是两个主角呢,说好的内存缓存呢?其实在Volley中已经默认实现内存缓存了,我们简单的介绍下Volley的接口及关键函数(以下为引用)。 ImageLoader ImageLoader类需要一个请求的实例以及一个ImageCache类的实现。图片通过传递一个URL和一个ImageListener实例到get()方法进行加载。从那里,ImageLoader检查ImageCache,如果图像不是在缓存中,就从网络中加载图片。 NetworkImageView 这个类代替布局中的ImageViews类,而且需要使用ImageLoader类。NetworkImageView类的setUrl()方法需要一个URL路径字符串和一个ImageLoader实例。然后使用ImageLoder的get()方法来获取图片数据。 <com.android.volley.toolbox.NetworkImageViewandroid:id="@+id/twitterUserImage"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:layout_width="40dp"android:layout_height="40dp"android:padding="5dp"/> ImageCache Volley库的ImageCache接口允许你使用你喜好的L1缓存实现。 ImageCache接口有两个方法,getBitmap(Stringurl)和putBitmap(Stringurl,Bitmapbitmap)。这些桩是非常简单的,它们可以添加到任何缓存实现里。 有两种可用的缓存实现。推荐的方法是在内存中使用一个基础的LRU缓存。对于硬盘的缓存实现,我选择使用JackWharton编写的DiskLruCache。我选择这个实现是因为它在Android社区中被频繁的使用。使用一个基于磁盘的L1缓存可能导致阻塞I/O问题。Volley已经有一个隐式的硬盘L2缓存。硬盘L1缓存已经被包含在内了。 原生项目的介绍如下以下是这个实现的主要组件: 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和VolleyImageLoader引用。 在ImageCacheManager中,你可能注意到一点就是我们使用URL字符串的hashCode()作为缓存的键值。这是由于URL中的某些字符不能作为缓存的键值。 BuzzArrayAdapter 该适配器比较简单的。这里只需要注意一点,我们要实现Volley的Listener和ErrorListener接口,并且把该适配器作为Listener参数传递给了NetworkImageView的setUrl(Stringstring,Listenerlistener,ErrorListenererr