Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Mejor manera de almacenar datos en caché en Android

Tengo un ArrayList de la costumbre, objetos Serializable simples que quisiera poner en caché al disco y leer en relanzar. Mis datos son muy pequeños, unos 25 objetos y como mucho 5 listas, así que creo que SQLite sería un exceso. En el mundo del iPhone usaría NSKeyedArchiver y NSKeyedUnarchiver que funciona muy bien. En Android he intentado hacer esto con un FileOutputStream y ObjectOutputStream y mientras el resultado es el mismo, el rendimiento es terrible. ¿Existe una manera mejor (leer más rápido) para almacenar objetos pequeños en el sistema de archivos en Android?

  • Cómo url codificar en android?
  • ¿Cómo evitar que los SMS lleguen a la bandeja de entrada en Android?
  • ¿Cómo puedo restaurar mi proyecto a una versión anterior en Android Studio?
  • Guardar la entrada de audio del motor de reconocimiento de voz de Android Stock
  • Mejor método de ver la salida de "bugreport adb"? ``
  • IllegalStateException en HardwareRenderer createSurface
  • Ordenar la colección por varios campos en Kotlin
  • ¿Se requiere el botón de exploración?
  • Actualizar la Galería después de eliminar un archivo de imagen?
  • ¿Cómo saber si una aplicación se instala desde google play o side-load?
  • ¿Cómo importar las aplicaciones de AOSP (lanzador, contactos, ...) en Android-Studio?
  • ¿Cómo llevar una actividad al primer plano (parte superior de la pila)?
  • 4 Solutions collect form web for “Mejor manera de almacenar datos en caché en Android”

    Por lo que vale la pena almacenar en caché algunos de mis datos de String en disco usando BufferedWriter / BufferedReader y es muy rápido. De hecho, es más rápido que almacenar los mismos datos en SharedPreferences. El código es algo como esto (tenga en cuenta que las cosas suceden más rápido cuando se proporciona el tamaño del búfer)

     final BufferedWriter out = new BufferedWriter(new FileWriter(file), 1024); out.write(stuff); out.close(); 
     public class MyClass implements Serializable { private static final long serialVersionUID = 1L; public String title; public String startTime; public String endTime; public String day; public boolean classEnabled; public MyClass(String title, String startTime, boolean enable) { this.title = title; this.startTime = startTime; this.classEnabled = enable; } public boolean saveObject(MyClass obj) { final File suspend_f=new File(SerializationTest.cacheDir, "test"); FileOutputStream fos = null; ObjectOutputStream oos = null; boolean keep = true; try { fos = new FileOutputStream(suspend_f); oos = new ObjectOutputStream(fos); oos.writeObject(obj); } catch (Exception e) { keep = false; } finally { try { if (oos != null) oos.close(); if (fos != null) fos.close(); if (keep == false) suspend_f.delete(); } catch (Exception e) { /* do nothing */ } } return keep; } public MyClass getObject(Context c) { final File suspend_f=new File(SerializationTest.cacheDir, "test"); MyClass simpleClass= null; FileInputStream fis = null; ObjectInputStream is = null; try { fis = new FileInputStream(suspend_f); is = new ObjectInputStream(fis); simpleClass = (MyClass) is.readObject(); } catch(Exception e) { String val= e.getMessage(); } finally { try { if (fis != null) fis.close(); if (is != null) is.close(); } catch (Exception e) { } } return simpleClass; } 

    Y llamando desde la actividad

      if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"MyCustomObject"); else cacheDir= getCacheDir(); if(!cacheDir.exists()) cacheDir.mkdirs(); MyClass m = new MyClass("umer", "asif", true); boolean result = m.saveObject(m); if(result) Toast.makeText(this, "Saved object", Toast.LENGTH_LONG).show(); else Toast.makeText(this, "Error saving object", Toast.LENGTH_LONG).show(); MyClass m = new MyClass(); MyClass c = m.getObject(this); if(c!= null) Toast.makeText(this, "Retrieved object", Toast.LENGTH_LONG).show(); else Toast.makeText(this, "Error retrieving object", Toast.LENGTH_LONG).show(); 

    No olvide utilizar los permisos write_external_storage en el archivo de manifiesto.

    Es difícil saberlo sin perfiles, pero mi conjetura es que su mal desempeño se reduce a usar ObjectOutputStream . Ha intentado escribir sus propios writeObject(ObjectOutputStream) y readObject(ObjectOutputStream) , ya que esto puede ayudar al rendimiento.

    Puede utilizar la herramienta traceview para ver exactamente dónde se está ejecutando la aplicación lentamente. Echa un vistazo a esta pregunta para obtener instrucciones sobre cómo utilizar traceview .

    Esta biblioteca puede ayudarte a:

    http://github.com/afollestad/Silk (editar: ya no está disponible)

    Consulte SilkCacheManager y SilkCachedFeedFragment / SilkLastUpdatedFragment.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.