BitmapFun示例应用程序中的图像缓存 - 此检查背后的基本原理是什么

时间:2013-01-28 17:25:34

标签: android caching android-emulator

我想为图像实现内存和磁盘缓存。调查我发现了这个链接和示例代码(您可以从右侧的链接下载)

http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

代码中的某处有这种方法:

/**
 * Get a usable cache directory (external if available, internal otherwise).
 *
 * @param context The context to use
 * @param uniqueName A unique directory name to append to the cache dir
 * @return The cache dir
 */
public static File getDiskCacheDir(Context context, String uniqueName) {
    // Check if media is mounted or storage is built-in, if so, try and use external cache dir
    // otherwise use internal cache dir
    final String cachePath =
            Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ||
                    !isExternalStorageRemovable() ? getExternalCacheDir(context).getPath() :
                            context.getCacheDir().getPath();

    return new File(cachePath + File.separator + uniqueName);
}

我想知道这项检查背后的理由是什么:

Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ||
                    !isExternalStorageRemovable()

第二部分对我来说似乎是多余的。这可以理解为“即使没有安装外部存储器也让我使用它,因为它无法移除”,但显然你不能将它用于缓存,因为它没有安装。

使用此代码在模拟器上发生了有趣的事情。它基于Galaxy Nexus和未指定的SD卡在AVD上崩溃。第一部分将返回false(它将其视为“已删除”),第二部分将返回true(因为“外部”存储在GN上不可移除)。因此它会尝试使用外部存储器,因为它无法使用它会崩溃。

我已经用我的Galaxy Nexus进行了测试,看看手机连接到PC或Mac时的第一部分价值是什么,两次都是如此。它仍然安装,但PC或Mac可以写入它。

如果您需要它们,请参阅上述代码中的其他使用方法:

/**
 * Check if external storage is built-in or removable.
 *
 * @return True if external storage is removable (like an SD card), false
 *         otherwise.
 */
@TargetApi(9)
public static boolean isExternalStorageRemovable() {
    if (Utils.hasGingerbread()) {
        return Environment.isExternalStorageRemovable();
    }
    return true;
}

/**
 * Get the external app cache directory.
 *
 * @param context The context to use
 * @return The external cache dir
 */
@TargetApi(8)
public static File getExternalCacheDir(Context context) {
    if (Utils.hasFroyo()) {
        return context.getExternalCacheDir();
    }

    // Before Froyo we need to construct the external cache dir ourselves
    final String cacheDir = "/Android/data/" + context.getPackageName() + "/cache/";
    return new File(Environment.getExternalStorageDirectory().getPath() + cacheDir);
}

加分问题:是否有人在制作中使用此代码?这是个好主意吗?

1 个答案:

答案 0 :(得分:1)

发表我自己的评论作为答案。它可能对其他人有帮助。 :

getExternalStorageDirectory并不总是返回SD卡。这就是实施安全检查的原因。

我发布here的类似答案,总是检查它是一个好习惯。

希望这会给你一些关于双重​​检查的提示。