我正在使用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/

10-10 20:22