Android AsyncTask und SQLite DB-Instanz

8

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%     
Marqs 22.09.2011, 11:29
quelle

3 Antworten

1

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.

    
Hemant Sharma 22.09.2011, 12:03
quelle
11

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.

    
Dmitry Ryadnenko 22.09.2011 11:44
quelle
5

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.

    
Ovidiu Latcu 22.09.2011 11:35
quelle