SharedPreferences in AsyncTask speichern. Sinvoll oder nicht?

  • Antworten:10
Gelöschter Account
  • Forum-Beiträge: 2.492

11.08.2015, 15:10:46 via Website

Hallo,

ich habe mich in letzter Zeit mehr mit dem Thema Speicherbelegung und Performance von Apps allgemein beschäftigt. Dabei bin ich natürlich auch darauf gestoßen I/O Operationen nicht auf dem UI - Thread durchzuführen, falls diese lange dauern (zu ANRs führen) können.
In meiner App dauert besonders das Speichern von einigen SharedPreferences etwas länger und bei einer großen Menge, kann man auch mal 1-2 Sekunden Wartezeit haben.
Durch Recherche bin ich dann auf folgendes gestoßen
http://stackoverflow.com/questions/4371273/should-accessing-sharedpreferences-be-done-off-the-ui-thread
Die Antwort von Brad Fitzpatrick finde ich beantwortet die Frage jetzt nicht so richtig (kann auch ein Verständnisproblem sein).
Etwas in einem "worker"-Thread durchzuführen ist ja recht einfach mit einem AsyncTask. Macht es für mich, oder überhaupt allgemein Sinn die SharedPreferences in einem AsyncTask in der doInBackground zu speichern? Wenn ja würde es ja auch Sinn machen die in einem "worker"-Thread zu laden (nur dann am besten mit ProgressBar oder ähnliches) oder nicht?
Das Speichern meiner Daten findet nur in der onPause statt.

Würde mich über Hilfe freuen!

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.958

11.08.2015, 15:14:56 via Website

Hallo,

benutze statt commit, apply das soll performance verbessern.

Und nicht jeden Wert einzeln speichern sondern als "packet".

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Gelöschter Account

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

11.08.2015, 15:15:58 via Website

Apply nutze ich bereits (hat auch deutlich geholfen). Aber wenn meine App trotzdem manchmal "hängt" kann es ja nicht komplett asynchron sein oder?

Wie meinst du das?

— geändert am 11.08.2015, 15:19:25

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.958

11.08.2015, 15:28:08 via Website

Wenn ich in der Docu schau steht dort zwar nicht das es async läuft, aber das Framwork wartet bis alle Werte gespeichert sind. Und weiter steht:"commit läuft im Gegensatz zu apply synchron" also würde ich als asynchrone ansehen.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

11.08.2015, 15:51:34 via Website

Also würdest du die Frage, ob es Sinn macht die Prefs im AsyncTask zu speichern mit Nein beantworten?

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

11.08.2015, 16:55:45 via Website

Das einzige was Du in der Konstellation beachten musst, ist, dass Du Situationen erzeugen kannst, in denen nachfolgende LESEzugriffe, die unmittelbar nach dem execute() des AsyncTask erfolgen, evtl. noch alte Daten bekommen.
Zwischen execute() und doInBackground() kann eine relativ lange Zeit liegen. Speziell bei der sequenziellen Ausführung.

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

11.08.2015, 17:37:34 via App

Falls also die onpause aufgerufen wird und direkt danach wieder die onresume wo die Daten geladen werden dann aber im unglücklichen Fall noch die alten Daten sind?

Antworten
Gelöschter Account
  • Forum-Beiträge: 438

11.08.2015, 17:51:51 via Website

Vorab: ich habe das Problem nicht, insofern ist meine Antwort theoretisch und aus dem hohlen Bauch heraus und sollte praktisch verifiziert werden.

Nachdem Fitzpatrick schreibt: "so you'll probably want to load the SharedPreferences during your onCreate() and re-use the same instance, avoiding the stat." würde ich einen SharedPreference-Singleton im Application Objekt anlegen und alles darüber laufen lassen. (Verhindert natürlich nicht Concurrency Probleme bei async Operationen, aber einen Tod muss man wohl sterben.)

BTW hast Du verifiziert, dass die 1-2 Sekunden Lag von denen Du sprichst tatsächlich durch die SharedPreferences verursacht werden? Oder könnte es zB auch ein GC sein?

Aktuelles Entwicklungsprojekt: (thinking) Sudoku Dojo Free (lightbulb)
Ich freue mich über Tester/innen.

Gelöschter Account

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

12.08.2015, 07:31:37 via App

Also in der oncreate oder resume eine sharedprefs anlegen die für die ganze activity sichtbar ist und dann nur die verwenden?

nein das habe ich noch nicht, wollte mal mit paar Tools drüber schauen evtl schaff ich es heute.

— geändert am 12.08.2015, 07:32:12

Antworten
Gelöschter Account
  • Forum-Beiträge: 438

12.08.2015, 09:00:49 via Website

Lars F.

Also in der oncreate oder resume eine sharedprefs anlegen die für die ganze activity sichtbar ist und dann nur die verwenden?

Mal ein zusammengestrichenes Beispiel aus meiner App, ergänzt um SharedPreferences (die ich - wie gesagt - so nicht benötige). ACHTUNG: Die Streichungen/Ergänzungen habe ich aus der hohlen Hand (i.e. ohne Compiler) gemacht.

public class SudokuDojoApplication extends Application {
    // EDIT: Die Konstante hatte ich beim ersten Post vergessen...
    private static final String PREFS = "SudokuDojoPrefs";

    private static Context sContext;
    private static SharedPreferences sSharedPreferences;

    public static Context getAppContext() {
        return sContext;
    }

    public static SharedPreferences getSharedPreferences() {
        return sSharedPreferences;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        sContext = this;
        sSharedPreferences = sContext.getSharedPreferences(PREFS, MODE_PRIVATE);

        // Globale Loggingkonfiguration
        if (BuildConfig.DEBUG) {
            Timber.plant(new SudokuDebugTree(getAssets()));
        } else {
            Timber.uprootAll();
        }
    }
}

Wenn Du bisher kein eigenes Application-Objekt hattest, musst Du das im Manifest deklarieren, z.B.:

<application
    android:name=".SudokuDojoApplication"
    android:icon="@drawable/ic_launcher"
[...]

Siehe auch folgendes Rezept aus dem Android Cookbook.

nein das habe ich noch nicht, wollte mal mit paar Tools drüber schauen evtl schaff ich es heute.

Das würde ich dringend machen, nicht dass Du in die falsche Richtung läufst und jetzt auch noch anfängst, Gas zu geben...

— geändert am 12.08.2015, 09:03:02

Aktuelles Entwicklungsprojekt: (thinking) Sudoku Dojo Free (lightbulb)
Ich freue mich über Tester/innen.

Antworten