4

画像用のメモリとディスク キャッシュの両方を実装したいと考えています。調査中 このリンクとサンプルコードを見つけました (右のリンクからダウンロードできます)

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()

2番目の部分は冗長に思えます。これは「外部ストレージがマウントされていなくても外せないから使おう」と読めますが、当然マウントされていないのでキャッシングには使えません。

このコードを使用すると、エミュレーターで面白いことが起こっています。指定されていない Galaxy Nexus および SD カードに基づく AVD でクラッシュします。最初の部分は false を返し (「削除済み」と見なされます)、2 番目の部分は 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);
}

おまけの質問:誰かがこのコードを本番環境で使用していますか? これは良い考えですか?

4

1 に答える 1