我正在尝试为ImageLoader的Android Volley Framework功能创建一个简单的演示。构造函数如下:
public ImageLoader(RequestQueue queue, ImageCache imageCache)
问题在于ImageCache
。它的JavaDoc声明:
简单缓存适配器接口。如果提供给ImageLoader,它 将在发送给Volley之前用作L1缓存。实现 一定不要阻止。建议使用LruCache实现。
如果没有这样的话 - 使用我现有的实现可能会产生什么负面影响(只是从文件中读取):
public byte [] get(String filename){
byte[] ret = null;
if (filesCache.containsKey(filename)) {
FileInfo fi = filesCache.get(filename);
BufferedInputStream input;
String path = cacheDir + "/" + fi.getStorageFilename();
try {
File file = new File(path);
if (file.exists()) {
input = new BufferedInputStream(new FileInputStream(file));
ret = IOUtils.toByteArray(input);
input.close();
} else {
KhandroidLog.e("Cannot find file " + path);
}
} catch (FileNotFoundException e) {
filesCache.remove(filename);
KhandroidLog.e("Cannot find file: " + path);
} catch (IOException e) {
KhandroidLog.e(e.getMessage());
}
}
return ret;
}
答案 0 :(得分:5)
在这种情况下,“实施必须阻止”究竟是什么意思?
在您的情况下,您无法执行磁盘I / O.
这是一级(L1)缓存,意味着它设计为在几微秒内返回,而不是毫秒或秒。这就是为什么他们提倡LruCache
,这是一个内存缓存。
是否有一个非阻塞文件缓存的例子(即使是非android但是“纯”的java),我可以用它来教育我自己如何将我现有的文件缓存转换为非阻塞?
L1缓存不应该是文件缓存。
使用我现有的实现可能会产生什么负面影响(只是从文件中读取)
L1缓存不应该是文件缓存。
Volley已经有一个名为DiskBasedCache
的集成L2文件缓存,用于缓存HTTP响应。如果您愿意,可以将自己的Cache
实施替换为DiskBasedCache
,并在创建RequestQueue
时提供。