Ich habe ein Problem und bin mir nicht sicher, wie ich es angehen soll. Eine Aktivität in meiner App hat mehrere AsyncTask
s, die auf einzelne SQLiteOpenHelper
zugreifen. Ich initialisiere und öffne den Helfer in onCreate()
und schließe ihn in onStop()
. Ich überprüfe auch, ob es in onResume()
initialisiert wurde.
Seit ich meine App veröffentlicht habe, habe ich eine Anzahl von Fehlern mit Null Exception in doInBackground
erhalten, wo ich versuche auf den DB Helfer zuzugreifen. Ich weiß, dass dies passiert, weil die DB geschlossen ist ( onStop()
), kurz bevor% code_% aufgerufen wird, fair genug.
Meine Frage ist, wo soll ich die DB-Verbindung schließen? Ist es richtig, eine einzelne Instanz des DB-Helpers in der Aktivität zu verwenden und darauf von mehreren Threads aus zuzugreifen ( doInBackground
)? Oder ich sollte für jedes AsyncTasks
? Separate DB-Helper-Instanz verwenden?
Dies ist ein vereinfachtes Skelett meiner Aktivität:
%Vor%Sie haben erwähnt, dass Sie die AsyncTask vor dem Schließen der Datenbank abbrechen. Sie sollten jedoch bedenken, dass das Abbrechen der AsyncTask nur die zu löschende Aufgabe signalisiert und Sie müssen isCancelled () in doInBackground () überprüfen und die DB-Operationen anhalten.
Bevor Sie die Datenbank schließen, müssen Sie getStatus () überprüfen, um sicherzustellen, dass die AsyncTask beendet wurde.
Sie müssen die Datenbankverbindung nicht für jede Aktivität verwalten. Sie können dies in einer Instanz von android.app.Application tun und mit dieser Instanz auf db zugreifen. Etwas wie das:
%Vor%Auf diese Weise können Sie sicher sein, dass Sie immer auf Db zugreifen können.
Und ja, eine Instanz von Db-Helfer ist eine gute Übung. Thread-Synchronisation ist standardmäßig für Sie gemacht.
Es ist gut, ein einzelnes DB Helper
zu verwenden.
Das Problem ist, dass, wenn der Benutzer die Activity
verlässt, die DB
geschlossen ist, die AsyncTask
jedoch möglicherweise noch läuft. Sie sollten also überprüfen, dass DB
nicht null ist, wenn Sie versuchen, darauf zuzugreifen, und wenn es null
ist, kann dies bedeuten, dass Ihre Activity
zerstört wurde und cancel
diese Aufgabe.
Tags und Links android sqlite android-asynctask sqliteopenhelper