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-但不检查该值。As
mDiskCache.get(key)
在检查此项之前已返回null?

可能

    DiskLruCache.Editor editor = mDiskCache.edit(key);
已为null-但不检查该值。As
mDiskCache.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
实例。如果我错了,请纠正我。该密钥只能有一个=一个文件。我在哪里可以找到这方面的良好实现?我似乎找不到好的例子。我知道在这里使用优先级队列可能比较理想,但我以前没有在缓存方面做过很多工作。我在哪里可以找到一个很好的实现呢?我似乎找不到好的例子。我知道在这里使用优先级队列可能是很理想的,但我以前没有在缓存方面做过很多工作。