Caché de imágenes en la aplicación de ejemplo BitmapFun – ¿Cuál es la justificación detrás de este cheque?
Quiero implementar memoria y caché de disco para las imágenes. Investigar He encontrado este enlace y código de ejemplo (puede descargarlo desde el enlace de la derecha)
Http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
- ¿Por qué es mi teclado emulador de Android en modo de caracteres chinos?
- Problema del emulador HelloAndroid
- No se puede instalar la aplicación en el emulador 2.3.3: INSTALL_FAILED_DEXOPT
- ¿Cómo puedo detectar el uso de tamaño de montón de una aplicación de Android?
- Emulador de Android 5.0 mostrando el espacio de almacenamiento agotándose
En algún lugar del código hay este método:
/** * 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); }
Me pregunto cuál es la razón detrás de este cheque:
Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !isExternalStorageRemovable()
La segunda parte me parece redundante. Esto se puede leer como "incluso si el almacenamiento externo no está montado vamos a usarlo porque no se puede quitar", pero obviamente no se puede utilizar para el almacenamiento en caché, ya que no está montado.
Lo gracioso está sucediendo en el emulador con este código. Se bloquea en AVD basado en Galaxy Nexus y tarjeta SD no especificada. La primera parte devolverá false (lo verá como "removed") y la segunda devolverá true (porque el almacenamiento "externo" no es removible en GN). Por lo tanto, tratará de utilizar el almacenamiento externo y se bloqueará, ya que no se puede utilizar.
He probado con mi Nexus Galaxy para ver cuál es el valor de la primera parte cuando el teléfono está conectado a la PC pa o Mac y es cierto en ambas ocasiones. Todavía está montado, pero la PC o Mac puede escribir a él no menos.
En caso de necesitarlos aquí hay otros métodos utilizados en el código anterior:
/** * 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); }
Pregunta de la prima: ¿Está alguien usando este código en la producción? ¿Es esta una buena idea?
- Android Lollipop: Dónde encontrar el código de "API Demos" aplicación preinstalada en el Android Lollipop Nexus 5 emulador
- Uso de Google Play Games Services en el emulador
- Android Virtual Device (AVD) - ¿qué CPU / ABI debo seleccionar?
- Error de instalación: INSTALL_FAILED_INSUFFICIENT_STORAGE? Durante el emulador runing
- Mapa no obtener en el emulador android api v2
- ¿Es este error de Android Studio o estoy haciendo mal?
- Android sdk missing system-images
- Emulador de Android 5.0 no se inicia
Publicar mi propio comentario como respuesta. Puede ser útil para otra persona. :
GetExternalStorageDirectory no devuelve siempre la tarjeta SD. Por eso se implementó el control de seguridad.
Respuesta similar que había publicado aquí y es una buena práctica para comprobar siempre para ello.
Espero que esto le dará alguna pista sobre la doble verificación.
- ¿Es wpa_supplicant específico para el dispositivo android o específico para la versión android?
- Android.R.simple_spinner_adapter no se puede resolver