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?

  • Error: android.app.SuperNotCalledException
  • Guardar Logcat en un archivo de texto en el dispositivo Android
  • Proguard y error
  • Rotación de mapa de bits en la lona de Android
  • Cómo bloquear la orientación del teléfono en Android para evitar el modo horizontal
  • Exportar paquete de aplicaciones firmadas con línea de comandos
  • Cuenta atrás con la vista de texto
  • Representación inconsistente de SVG entre escritorio y móvil - ¿es Arial una fuente segura en SVG?
  • 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.