我正在使用DiskLruCache
缓存图像的网址。我使用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();
AssetManager
是一个自定义帮助程序类,它调用方法getAssetFilePath(...)
。在这段代码中,这里发生了异常: DiskLruCache.Snapshot snapshot = mDiskCache.get(key);
if (snapshot == null) {
DiskLruCache.Editor editor = mDiskCache.edit(key);
InputStream is = downloadFile(url);
if (is == null) return null;
// EXCEPTION OCCURS HERE
OutputStream os = editor.newOutputStream(0);
byte[] buffer = new byte[1024 * 10];
int len;
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
is.close();
os.close();
editor.commit();
}
具体来说,此行会导致异常:
OutputStream os = editor.newOutputStream(0);
我似乎无法在任何测试设备上重复此问题,但其他用户正在发生此问题。
此问题的原因是什么,我该如何解决?
日志告诉我:
由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);
已经为空-但是您无需检查。由于
mDiskCache.get(key)
在此之前似乎已经可以检查返回null了?关于java - 从DiskLruCache访问OutputStream时发生NullPointerException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34426130/