Java 从DiskLruCache访问OutputStream时出现NullPointerException
我正在使用Java 从DiskLruCache访问OutputStream时出现NullPointerException,java,android,caching,Java,Android,Caching,我正在使用DiskLruCache缓存图像的URL。我使用AsyncTask下载图像,如下所示: new AsyncTask<String, String, String>() { String path = null; @Override protected String doInBackground(String... params) { // Get the assets from DiskLruCa
DiskLruCache
缓存图像的URL。我使用AsyncTask
下载图像,如下所示:
new AsyncTask<String, String, String>() {
String path = null;
@Override
protected String doInBackground(String... params) {
// Get the assets from DiskLruCache
try {
if (url != null)
path = assetManager.getAssetFilePath(url);
} catch (IOException e) {
callback.downloadFailed();
}
return path;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if (path != null)
callback.assetDownloaded(path);
else
callback.downloadFailed();
}
}.execute();
具体来说,这一行会导致异常:
OutputStream os = editor.newOutputStream(0);
我似乎不能在我的任何测试设备上重复这个问题,但它正在发生在其他用户身上
这个问题的原因是什么?我如何着手解决它
logcat告诉我:
由java.lang.NullPointerException引起:尝试对空对象引用调用虚拟方法“java.io.OutputStream com.jakewharton.disklrucache.disklrucache$Editor.newOutputStream(int)”
有更好的方法吗
这也是初始化DiskLruCache的好方法吗?如果不是,那么什么是好的可伸缩初始化?寻找最佳实践和实现
public CacheManager() {
BASE_PATH = Environment.getExternalStorageDirectory().getPath() + "/exampleapp";
try {
mDiskCache = DiskLruCache.open(new File(BASE_PATH), VERSION, 1, CACHE_SIZE);
} catch (IOException e) {
Log.i(TAG, "Asset Manager IOException");
e.printStackTrace();
}
}
大概
DiskLruCache.Editor editor = mDiskCache.edit(key);
已为null-但不检查该值。AsmDiskCache.get(key)
在检查此项之前已返回null?可能
DiskLruCache.Editor editor = mDiskCache.edit(key);
已为null-但不检查该值。AsmDiskCache.get(key)
在检查之前已返回null?来自:
您应该检查它是否未返回null
,如果返回,请在以后没有其他编辑进行时重试。(可能在不同的线程上对编辑进行排队)。来自:
您应该检查它是否未返回
null
,如果返回,请在以后没有其他编辑进行时重试。(可能在不同的线程上对编辑进行排队)。在不同的线程中使用相同的编辑器会出现此错误。只需确保同步使用编辑器的方法即可
public synchronized writeMyDataToCache(String key, String data){
DiskLruCache.Editor editor = diskLruCache.edit(key);
writeSomethingToCache(editor, data);
}
在不同线程中使用相同的编辑器会导致此错误。只需确保同步使用编辑器的方法即可
public synchronized writeMyDataToCache(String key, String data){
DiskLruCache.Editor editor = diskLruCache.edit(key);
writeSomethingToCache(editor, data);
}
我怎样才能防止呢?这是正常的行为吗?有更好的方法处理吗?更好的架构?首先只需检查null,什么也不做-null可能表示另一个编辑处于活动状态(在另一个线程中下载)。如果同一个图像被多个线程读取,您有时会看到此错误,但并非总是如此。那么您不能在单独的线程中实例化另一个
编辑器?似乎有点问题,您只能运行一个Editor
实例。如果我错了,请纠正我。对于该密钥=对于一个文件,您只能有一个密钥。我如何防止这种情况?这是正常的行为吗?有更好的方法处理吗?更好的架构?首先只需检查null,什么也不做-null可能表示另一个编辑处于活动状态(在另一个线程中下载)。如果同一个图像被多个线程读取,您有时会看到此错误,但并非总是如此。那么您不能在单独的线程中实例化另一个编辑器?似乎有点问题,您只能运行一个Editor
实例。如果我错了,请纠正我。该密钥只能有一个=一个文件。我在哪里可以找到这方面的良好实现?我似乎找不到好的例子。我知道在这里使用优先级队列可能比较理想,但我以前没有在缓存方面做过很多工作。我在哪里可以找到一个很好的实现呢?我似乎找不到好的例子。我知道在这里使用优先级队列可能是很理想的,但我以前没有在缓存方面做过很多工作。