Frage Beste Möglichkeit, Daten in Android zu cachen


ich habe ein ArrayList von Gewohnheit, einfach Serializable Objekte, die ich auf die Festplatte cachen 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 verwenden NSKeyedArchiver und NSKeyedUnarchiver das funktioniert super. Auf Android habe ich versucht das mit einem zu tun FileOutputStream und ObjectOutputStream 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?


24
2018-01-05 03:41


Ursprung


Antworten:


Für was es wert ist, ich einige meiner String-Daten auf dem Datenträger mit BufferedWriter / BufferedReader zwischenspeichern und es ist sehr schnell. Tatsächlich ist es schneller als die gleichen Daten in SharedPreferences zu speichern. Der Code sieht ungefähr so ​​aus (beachten Sie, dass Dinge schneller passieren, wenn Sie die Puffergröße angeben)

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

19
2018-01-05 06:18



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 aus der Aktivität anrufen

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

Vergessen Sie nicht, write_external_storage-Berechtigungen in der Manifestdatei zu verwenden.


4
2017-07-15 11:02



Es ist schwer zu wissen, ohne Profiling, aber meine Vermutung ist Ihre schlechte Leistung ist auf die Verwendung ObjectOutputStream. Hast du versucht, dein eigenes zu schreiben? writeObject(ObjectOutputStream) und readObject(ObjectOutputStream) Methoden da dies der Leistung helfen kann.

Du könntest das benutzen traceview Werkzeug, um genau zu sehen, wo die Anwendung langsam läuft. Guck mal Bei dieser Frage finden Sie Anweisungen zur Verwendung traceview.


3
2018-01-05 09:16