2010-01-05 14 views
24

Ich habe eine ArrayList benutzerdefinierte, einfache Serializable Objekte, die ich auf der Festplatte zwischenspeichern und beim Neustart lesen möchte. Meine Daten sind sehr klein, ungefähr 25 Objekte und höchstens 5 Listen, also denke ich, dass SQLite übertrieben wäre. In der iPhone Welt würde ich NSKeyedArchiver und NSKeyedUnarchiver verwenden, was super funktioniert. Auf Android habe ich versucht, dies mit einer und ObjectOutputStream zu tun, und während das Ergebnis das gleiche ist, ist die Leistung schrecklich. Gibt es eine bessere (schneller) Möglichkeit, kleine Objekte im Dateisystem in Android zu cachen?Beste Möglichkeit zum Cache-Daten in Android

+0

Wissen Sie, welcher Teil der Performance-Hog ist? –

Antwort

19

Für was es wert ist, einige meiner String-Daten auf dem Datenträger mit BufferedWriter/BufferedReader zwischenzuspeichern und es ist sehr schnell. Tatsächlich ist es schneller als die gleichen Daten in SharedPreferences zu speichern. Der Code geht etwas ähnliches (beachten Sie, dass die Dinge schneller passieren, wenn Sie Puffergröße zur Verfügung stellen)

final BufferedWriter out = new BufferedWriter(new FileWriter(file), 1024); 
out.write(stuff); 
out.close(); 
+1

Ja, das Problem ist, ich will "Zeug", um meine serialisierten Objekte zu sein, die aus irgendeinem Grund scheint das Problem zu sein. –

+0

Gut, wenn Ihre Objekte einfach genug sind, können Sie readObject und writeObject überschreiben. – Bostone

+0

Also schrieb ich den rohen JSON-Text einfach mit dieser Methode in eine Datei und analysierte sie dann erneut, wenn ich ihn startete. Da der JSON klein ist, scheint er OK zu sein, obwohl ich immer noch nicht ganz glücklich damit bin, meine Objekte nicht auf die Festplatte zu serialisieren. –

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; 
} 

und Aufruf von Aktivität

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

nicht WRITE_EXTERNAL_STORAGE Berechtigungen in Manifest-Datei zu verwenden, vergessen.

Verwandte Themen