2010-01-05 22 views
24

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

+0

¿Sabes qué parte es el cerdo de rendimiento? –

Respuesta

19

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(); 
+1

Sí, el problema es que quiero que "cosas" sean mis objetos serializados que por alguna razón parece ser el problema. –

+0

Bueno, si sus objetos son lo suficientemente simples, puede sobrescribir readObject y writeObject – Bostone

+0

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. –

4
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.

Cuestiones relacionadas