1

我正在使用Jake Wharton 的 LRU 磁盘缓存来存储和检索在 ListView 中显示的位图。只要我在同一个活动中存储和访问位图,它就可以正常工作。但是,如果我尝试从应用程序中的其他活动访问缓存(即,我不必下载相同的图像两次),我会得到一个 NullPointerException。我在这里错过了什么吗?这不是可以/将要删除文件的内存缓存。只要我将它们指向内部存储中的正确目录,不应该从应用程序中的所有活动访问磁盘缓存吗?

01-14 22:53:44.465: E/AndroidRuntime(10720): java.lang.NullPointerException
01-14 22:53:44.465: E/AndroidRuntime(10720): at java.util.regex.Matcher.reset(Matcher.java:181)
01-14 22:53:44.465: E/AndroidRuntime(10720): at java.util.regex.Matcher.<init>(Matcher.java:94)
01-14 22:53:44.465: E/AndroidRuntime(10720): at java.util.regex.Pattern.matcher(Pattern.java:290)
01-14 22:53:44.465: E/AndroidRuntime(10720): at com.example.echofriendly.DiskLruCache.validateKey(DiskLruCache.java:629)
01-14 22:53:44.465: E/AndroidRuntime(10720): at com.example.echofriendly.DiskLruCache.get(DiskLruCache.java:375)
01-14 22:53:44.465: E/AndroidRuntime(10720): at com.example.echofriendly.DiskLruImageCache.containsKey(DiskLruImageCache.java:145)
01-14 22:53:44.465: E/AndroidRuntime(10720): at com.example.echofriendly.ChatroomFragment.getMessages(ChatroomFragment.java:309)
01-14 22:53:44.465: E/AndroidRuntime(10720): at com.example.echofriendly.ChatroomFragment.access$3(ChatroomFragment.java:284)
01-14 22:53:44.465: E/AndroidRuntime(10720): at com.example.echofriendly.ChatroomFragment$2.run(ChatroomFragment.java:94)
01-14 22:53:44.465: E/AndroidRuntime(10720): at java.lang.Thread.run(Thread.java:1019)
4

3 回答 3

1

只要我将它们指向内部存储中的正确目录,不应该从应用程序中的所有活动访问磁盘缓存吗?

听起来您在需要它的每个 Activity 中都实例化缓存。我不认为这是一个好主意。由于 Jake 的 LruCache 使用日志,在同一目录上工作的不同实例在我看来很容易分散彼此的注意力。

我的建议是,您可以引入某种单例作为活动和缓存之间的层,或者只存储对整个应用程序的一个缓存实例的引用。

此外,我建议您使用某种两级缓存,例如结合磁盘缓存的内存缓存(这是我在我的应用程序中所做的)。因此,您可以首先检查内存缓存,如果图像缓存在那里,则可以非常快速地获取图像。(可以是同步的)如果不存在,请询问磁盘缓存。(应该是异步的)最后一次调用你会下载它。(也是异步的)

于 2013-01-14T19:18:29.453 回答
0

清理 Activity 时可能会破坏缓存。检查库中的回调以获取此类清理调用。

于 2013-01-14T18:44:32.857 回答
0

我有同样的问题:几个活动使用相同的缓存。出现了两个问题: - 缓存从未被驱逐......我认为原因是第二点 - 如果在活动 A 之后调用活动 B: - 活动 B 已启动并打开缓存(但活动 A 不会关闭缓存然而!) - 活动 A 在 onStop() 方法中关闭缓存......而 B 刚刚打开它......

我的解决方案是为每个活动提供一个缓存目录:

// retrieve the name of the activity
String nameActivity = ModelActivity.getCurrentActivity().getClass().getSimpleName();

// set the cache directory with a name related to the activity
    DiskLruImageCache imageDiskCache = new DiskLruImageCache(ModelActivity.getCurrentContext(), 
                        "cacheMediaActivity"+nameActivity, 
                        DISK_CACHE_SIZE, 
                        CompressFormat.JPEG, 
                        70);

它对我有用!

于 2013-02-07T21:28:02.917 回答