2016-05-26 13 views
1

Fall: Damit die Benutzer meiner App die App auch verwenden können, wenn sie keinen Zugang zum Internet haben, speichere ich die Daten in einer SQLite-Datenbank. Damit verschiedene Teile der App auf aktuelle Benutzerdaten zugreifen können, verwende ich einen Singleton. Geht so;Android-Aktivität & Async SQLite-Kommunikation Optimierung

Daten abrufen und vor der Verwendung speichern: Anfrage an Server => Paket mit Daten => Singleton => SQLite DB.

zeigen Daten für Benutzer: SQLite DB => Java-Klassen => Singleton => Aktivität

Rufen Sie die Daten an die SQLite DB zu speichern:

DatabaseConductor dbc = new DatabaseConductor(getApplicationContext()); 
dbc.setReturnCue(MyActivity.this); 
dbc.execute(DataBaseActions.STUFF_SQL_IN); 

die DatabaseConductor ist einfach tut dies:

public class DataBaseConductor extends AsyncTask<String, String, String> { 
    private Context context; 
    private DataBaseConductorCueing returnCue = null; 

    for (String message : params) { 
     Log.d("Doing in BG", message); 
     switch (message) { 
      case THING_TO_DO: 
       methodToActiallyDoStuff(); 
       break; 
} 

Und ja, sowohl der DatabaseConductor als auch die aufrufende Aktivität verwenden ein Interfac e für die Kommunikation, dass Zeug gemacht wird. Wie so:

public interface DataBaseConductorCueing { 
    void processFinish(String output); 
} 

Vorerst verwende ich public static final Strings zu überprüfen, was getan werden muss, und um ehrlich zu sein, würde ENUM wahrscheinlich besser sein. Ich hoffe, dass dieser Code klar zeigt, wie es funktioniert. Gibt es andere Dinge, die getan werden könnten, um dies zu optimieren?

bearbeiten 1: Ganzzahlen sind besser als Enums.

bearbeiten 2: Das Entwurfsmuster für die Schnittstelle ist eine Callback-Schnittstelle, auf diese Weise müssen Sie keine Handler registrieren.

Antwort

1

Scheint, wie Abonnement dbc.setReturnCue(MyActivity.this);

Wenn Sie Sie nicht abmelden werden Speicherlecks bekommen.

Sie erwähnten Singleton, aber in der Code-Snippet-Instanz DatabaseConductor.

AsyncTasks werden seriell in einem einzelnen Hintergrundthread ausgeführt (aus API 11). So lange laufende Arbeiter können andere blockieren.

Wie oft schlagen Sie Anfragen? Sie können in Erwägung ziehen, Service zu verwenden.

public static final Strings zu überprüfen, was getan werden muss,

Haben Sie nur eine Aktivität Client?

Wie lösen Sie die Datensynchronisierung?

Wenn Sie wirklich um Optimierung kümmern, verwenden Sie nicht enum.

+0

Danke für den Link! und das Abmelden. Und wahr, in den Code-Schnipsel sind keine Beispiele für den Singleton. – Flummox