我正在使用Jake Wharton's LRU disk cache来存储和检索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)
最佳答案
只要我将它们指向内部存储中的正确目录,就不可以从应用程序中的所有活动访问磁盘缓存吗?
听起来好像您在需要它的每个Activity中实例化缓存。我认为这不是一个好主意。由于Jake的LruCache使用日记,因此在我看来,在同一目录上工作的不同实例很容易彼此分散注意力。
我的建议是,您要在活动和缓存之间引入某种单例,或者将引用存储为整个应用程序的一个缓存实例。
此外,我建议您使用某种二级缓存,例如与磁盘缓存结合使用的内存缓存(这就是我在应用程序中所做的事情)。因此,您可以先检查内存缓存,然后将其缓存在其中,从而真正快速地获取映像。 (可以是同步的)如果不存在,请询问磁盘缓存。 (应该是异步的),最后一次调用将下载它。 (也是异步的)