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
Antwort
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();
Ja, das Problem ist, ich will "Zeug", um meine serialisierten Objekte zu sein, die aus irgendeinem Grund scheint das Problem zu sein. –
Gut, wenn Ihre Objekte einfach genug sind, können Sie readObject und writeObject überschreiben. – Bostone
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. –
Es ist schwer, ohne Profilierung zu wissen, aber meine Vermutung ist Ihre schlechte Leistung ist unten ObjectOutputStream
zu verwenden. Haben Sie versucht, Ihre eigene writeObject(ObjectOutputStream)
and readObject(ObjectOutputStream)
methods zu schreiben, da dies der Leistung helfen kann.
Mit dem Tool traceview
können Sie genau sehen, wo die Anwendung langsam ausgeführt wird. Schau mal 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;
}
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.
- 1. Die beste Methode zum Synchronisieren von Cachedaten zwischen zwei Servern
- 2. Beste Möglichkeit zum Speichern gemeinsamer Daten in Android
- 3. WCF-Dienst Cachedaten?
- 4. Beste Möglichkeit, Nachrichtenartikel in Android zu speichern?
- 5. beste Möglichkeit zum Download multiple kleine Bilder
- 6. Beste Möglichkeit zum Speichern von Protokollen/Statistiken
- 7. Beste Möglichkeit zum Drucken von C#/.net?
- 8. beste Möglichkeit zum Sichern meiner Wordpress
- 9. Beste Möglichkeit zum Testen der CRC-Logik?
- 10. Die beste Möglichkeit zum Teilen von httpClient-Instanzen zwischen Aktivitäten?
- 11. beste Möglichkeit, ui Thread in Android zu aktualisieren
- 12. Die beste Möglichkeit zum Deaktivieren der Spaltenüberschrift in DataGridView
- 13. beste Möglichkeit zum Konvertieren von Sammlung in String
- 14. Beste Möglichkeit zum Speichern von Benutzeroptionen in C#
- 15. beste Möglichkeit zum Erstellen einer globalen Variablen in Spring MVC
- 16. beste Möglichkeit zum Entfernen von '-' in Oracle SP
- 17. Android beste Möglichkeit zum Parsen und Hinzufügen von XML-Elementen in SQLite DB?
- 18. Die beste Möglichkeit, AsyncTasks in Android regelmäßig auszuführen
- 19. Die beste Möglichkeit, Tabellen mit SQLite in Android
- 20. beste Möglichkeit, Kollisionsdetektor in oop
- 21. Beste Möglichkeit, Debug-Code einzubeziehen?
- 22. Die beste Möglichkeit zum Einfügen mehrerer Zeilen (ADO.NET)
- 23. Beste Möglichkeit zum Speichern/Verarbeiten benutzerspezifischen API-Schlüssel und Geheimnisse?
- 24. beste Möglichkeit zum Synchronisieren der Daten zwischen Business und Datenbank
- 25. Beste/sicherste Möglichkeit zum Upgrade Elastische Suche auf dem Mac
- 26. Die beste Möglichkeit zum Speichern von Konfigurationseinstellungen für T4
- 27. Oberklasse Mismatch für Klasse CommentsController (TypeError), beste Möglichkeit zum Umbenennen?
- 28. beste Möglichkeit zum Konvertieren und Validieren einer Datumszeichenkette
- 29. Die beste Möglichkeit zum Deaktivieren von ViewPager Paging
- 30. DSC Push-Modus - beste Möglichkeit zum Kopieren von DSC-Ressourcen
Wissen Sie, welcher Teil der Performance-Hog ist? –