4

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

public ImageLoader(RequestQueue queue, ImageCache imageCache)

问题出在ImageCache. 它的 JavaDoc 指出:

简单的缓存适配器接口。如果提供给 ImageLoader,它将在分派给 Volley 之前用作 L1 缓存。实现不得阻塞。建议使用 LruCache 实现。

  1. 在这种情况下,“实施不得阻塞”到底是什么意思?
  2. 是否有一个非阻塞文件缓存(甚至是非 android 但“纯”java)的示例,我可以用它来教育我自己如何将现有文件缓存转换为非阻塞?
  3. 如果不存在这样的 - 使用我现有的实现可能是什么负面影响(只是从文件中读取):

    公共字节 [] 获取(字符串文件名){

    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;
    

    }

4

1 回答 1

5

在这种情况下,“实施不得阻塞”到底是什么意思?

在您的情况下,您不能进行磁盘 I/O。

这是一级 (L1) 缓存,这意味着它旨在在几微秒内返回,而不是毫秒或秒。这就是他们提倡的原因LruCache,即内存缓存。

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

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

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

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

Volley 已经有一个集成的 L2 文件缓存,名为DiskBasedCache,用于缓存 HTTP 响应。如果您愿意,您可以替换自己的Cachefor实现,并在创建.DiskBasedCacheRequestQueue

于 2013-05-21T21:20:24.407 回答