非阻塞文件缓存(BitmapLruCache)实现?

时间:2013-05-21 20:26:32

标签: java android android-volley

我正在尝试为ImageLoaderAndroid Volley Framework功能创建一个简单的演示。构造函数如下:

public ImageLoader(RequestQueue queue, ImageCache imageCache)

问题在于ImageCache。它的JavaDoc声明:

  

简单缓存适配器接口。如果提供给ImageLoader,它   将在发送给Volley之前用作L1缓存。实现   一定不要阻止。建议使用LruCache实现。

  1. 在这种情况下,“实施必须阻止”究竟是什么意思?
  2. 是否有一个非阻塞文件缓存的例子(即使是非android但是“纯”java),我可以用它来教育我自己如何将我现有的文件缓存转换为非阻塞?
  3. 如果没有这样的话 - 使用我现有的实现可能会产生什么负面影响(只是从文件中读取):

    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;
    

    }

1 个答案:

答案 0 :(得分:5)

  

在这种情况下,“实施必须阻止”究竟是什么意思?

在您的情况下,您无法执行磁盘I / O.

这是一级(L1)缓存,意味着它设计为在几微秒内返回,而不是毫秒或秒。这就是为什么他们提倡LruCache,这是一个内存缓存。

  

是否有一个非阻塞文件缓存的例子(即使是非android但是“纯”的java),我可以用它来教育我自己如何将我现有的文件缓存转换为非阻塞?

L1缓存不应该是文件缓存。

  

使用我现有的实现可能会产生什么负面影响(只是从文件中读取)

L1缓存不应该是文件缓存。

Volley已经有一个名为DiskBasedCache的集成L2文件缓存,用于缓存HTTP响应。如果您愿意,可以将自己的Cache实施替换为DiskBasedCache,并在创建RequestQueue时提供。