Tengo un ArrayList
de objetos personalizados, simples Serializable
que me gustaría guardar en el disco y leer en el relanzamiento. Mis datos son muy pequeños, alrededor de 25 objetos y, como máximo, 5 listas, por lo que creo que SQLite sería excesivo. 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 aunque el resultado es el mismo, el rendimiento es terrible. ¿Hay alguna forma mejor (leer más rápido) para almacenar en caché objetos pequeños en el sistema de archivos de Android?La mejor manera de almacenar datos en caché en Android
Respuesta
Por lo que vale, guardo en caché algunos de mis datos String en el 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 usted proporciona tamaño del buffer)
final BufferedWriter out = new BufferedWriter(new FileWriter(file), 1024);
out.write(stuff);
out.close();
Sí, el problema es que quiero que "cosas" sean mis objetos serializados que por alguna razón parece ser el problema. –
Bueno, si sus objetos son lo suficientemente simples, puede sobrescribir readObject y writeObject – Bostone
Así que terminé simplemente escribiendo el texto JSON en bruto en un archivo usando este método y luego volviéndolo a analizar cuando lo inicié. Como el JSON es pequeño, parece funcionar bien, aunque todavía no estoy del todo satisfecho con la imposibilidad de serializar mis objetos en el disco. –
Es difícil saber sin perfiles pero mi conjetura es que su bajo rendimiento se debe a utilizar ObjectOutputStream
. ¿Ha intentado escribir su propio writeObject(ObjectOutputStream)
and readObject(ObjectOutputStream)
methods ya que esto puede ayudar al rendimiento.
Puede usar la herramienta traceview
para ver exactamente dónde está funcionando la aplicación lentamente. Eche un vistazo at this question for instructions on how to use traceview
.
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 a 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 se olvide de utilizar los permisos WRITE_EXTERNAL_STORAGE en el archivo de manifiesto.
- 1. Mejor manera de almacenar datos en caché
- 2. La mejor manera de almacenar datos en android
- 3. La mejor solución para almacenar en caché
- 4. La mejor manera de almacenar fecha/hora en datos básicos
- 5. La mejor manera de almacenar datos jerárquicos en hbase
- 6. La mejor manera de almacenar variables globales
- 7. ¿Cuál es la mejor manera de almacenar datos como 'Favoritos' en una aplicación de Android?
- 8. La mejor manera de almacenar en caché una colección de objetos. ¿Juntos o como artículos individuales?
- 9. ¿Cuál es la mejor manera de almacenar datos de tendencia?
- 10. Cómo almacenar datos en caché en symfony2
- 11. La mejor manera de almacenar muchos archivos en el disco
- 12. La mejor manera de almacenar en caché las imágenes redimensionadas usando PHP y MySQL
- 13. La mejor manera de cargar datos externos en android
- 14. La mejor manera de almacenar fechas antiguas en SQL Server
- 15. La mejor manera de almacenar la contraseña en sql
- 16. La mejor manera de almacenar etiquetas jerárquicas
- 17. La mejor manera de almacenar tiempos de eventos en la base de datos (My) SQL
- 18. Manera eficiente de almacenar imágenes en android
- 19. Almacenar datos estáticos en Android: ¿recurso personalizado?
- 20. La mejor manera de almacenar una matriz dispersa en .NET
- 21. ¿La mejor manera de almacenar IP en la base de datos?
- 22. La mejor manera de almacenar valores enum en la base de datos - String o Int
- 23. La mejor manera de almacenar varios indicadores en la base de datos
- 24. ¿Cuál es la mejor manera de almacenar un valor monetario en la base de datos?
- 25. ¿La mejor manera de almacenar una matriz en la base de datos MySQL?
- 26. La mejor manera de almacenar en caché una respuesta XML/JSON en mi aplicación. ¿Archivo de texto completo?
- 27. mejor manera de desactivar el almacenamiento en caché del cliente
- 28. ¿Cuál es la mejor manera de almacenar un conjunto de Delphi en un conjunto de datos?
- 29. ¿Cuál es la mejor manera de almacenar información de zona horaria en mi base de datos?
- 30. Consejo de almacenamiento de datos necesario: ¿la mejor manera de almacenar datos de ubicación + tiempo?
¿Sabes qué parte es el cerdo de rendimiento? –