0

Ich möchte viele Werte in SharedPreferences setzen, aber das blockiert meinen UI-Thread. Ich habe versucht, dies in ASyncTask doInBackground() und auch mit einem Handler zu tun, aber beide Versuche erwiesen sich als nutzlos.Wie SharedPreferences bearbeiten, ohne UI-Thread zu blockieren?

Hier ist die Methode:

 .... 
     Context c = RamadanWidgetConfig.this; 
     savedDataSehri = c.getSharedPreferences("Sehri", 0); 
     savedDataIftar = c.getSharedPreferences("Iftar", 0); 
     boolean sFilled = savedDataSehri.getBoolean("filled", false); 
     boolean iFilled = savedDataIftar.getBoolean("filled", false); 
     if (!sFilled || !iFilled) { 
      fillSharedPreferences(); 
     } .... 

private void fillSharedPreferences() { 

    String date[] = {"6/18/2015", "6/19/2015", "6/20/2015", "6/21/2015", "6/22/2015", "6/23/2015", "6/24/2015", "6/25/2015", "6/26/2015", "6/27/2015", "6/28/2015", "6/29/2015", "6/30/2015", "7/1/2015", "7/2/2015", "7/3/2015", "7/4/2015", "7/5/2015", "7/6/2015", "7/7/2015", "7/8/2015", "7/9/2015", "7/10/2015", "7/11/2015", "7/12/2015", "7/13/2015", "7/14/2015", "7/15/2015", "7/16/2015", "7/17/2015"}; 
    String sehri[] = {"4:13 AM", "4:13 AM", "4:14 AM", "4:14 AM", "4:14 AM", "4:14 AM", "4:15 AM", "4:15 AM", "4:15 AM", "4:15 AM", "4:16 AM", "4:16 AM", "4:17 AM", "4:17 AM", "4:17 AM", "4:18 AM", "4:18 AM", "4:19 AM", "4:19 AM", "4:20 AM", "4:20 AM", "4:21 AM", "4:21 AM", "4:22 AM", "4:22 AM", "4:23 AM", "4:24 AM", "4:24 AM", "4:25 AM", "4:26 AM"}; 
    String iftar[] = {"7:24 PM", "7:25 PM", "7:25 PM", "7:25 PM", "7:25 PM", "7:25 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:25 PM", "7:25 PM", "7:25 PM", "7:25 PM", "7:24 PM"}; 

    SharedPreferences.Editor editorSehri = savedDataSehri.edit(); 
    SharedPreferences.Editor editorIftar = savedDataIftar.edit(); 

    for (int i = 0; i < date.length; i++) { 
     editorSehri.putString(date[i], sehri[i]); 
     editorIftar.putString(date[i], iftar[i]); 
    } 
    editorSehri.putBoolean("filled", true); 
    editorIftar.putBoolean("filled", true); 
    editorSehri.apply(); 
    editorIftar.apply(); 
} 

Im Grunde bin ich ein Widget Home-Bildschirm hinzufügen und vor dem Hinzufügen ich überprüft habe, wenn ich die Daten haben oder nicht. Diese Methode wird aufgerufen, wenn ich die Daten nicht habe. Wenn dies nicht aufgerufen wird, wird der andere Code innerhalb von Millisekunden ausgeführt.

EDIT: Eigentlich habe ich herausgefunden, dass das Problem woanders liegt. Ich löschte die Daten der App, bevor ich das Widget hinzufügte, um SharedPreferences zu löschen, aber später fand ich heraus, dass das Löschen von Daten auch etwas anderes löscht, das mit dem ersten Start der App zusammenhängt. Die App benötigt beim ersten Start immer lange. Vielleicht macht es Dinge auf, aber ich weiß nicht genau, was vor sich geht. Nach dem Löschen der Daten und dem anschließenden Hinzufügen des Widgets wurde die App also zum ersten Mal gestartet. Deshalb verlangsamte es sich und ich dachte, SharedPreferences würde es langsam machen.

Jetzt muss ich herausfinden, warum die App bei ihrem ersten Start so lange braucht und wie man sie vermeidet. (Splash Screen kommt mir zuerst in den Sinn).

Antwort

0

Nicht klar, welcher Teil für das Füllen von Daten verantwortlich ist. Im Allgemeinen SharedPreferences ist threadsicher, unterstützt jedoch nicht die Verwendung über mehrere Prozesse hinweg.

Mit einem Kaltstart (keine Daten) Wie warten Sie Ergebnis? Die ständige Überprüfung kann die Benutzeroberfläche weiterhin blockieren, auch wenn Sie Threading zum Einfügen von Daten verwenden.

Wenn Sie eine große Menge an strukturierten Datensätzen verwenden, sollten Sie SQLite verwenden. Um Daten zu füllen, können Sie den Dienst verwenden.

+0

Ich habe weitere Codezeilen hinzugefügt, um anzuzeigen, wann und wie diese Methode aufgerufen wird. Ich überprüfe einfach einen Wert von SharedPreferences, der "gefüllt" genannt wird. Wenn es wahr ist, dann habe ich die Daten. In allen anderen Fällen werde ich davon ausgehen, dass keine Daten vorliegen. – Usman

+0

Wie hast du versucht Threading? Lebt der gesamte Code im Widget? –

+0

Eigentlich habe ich herausgefunden, dass das Problem woanders liegt. Ich löschte die Daten der App, bevor ich das Widget hinzufügte, um SharedPreferences zu löschen, aber später fand ich heraus, dass das Löschen von Daten auch etwas anderes löscht, das mit dem ersten Start der App zusammenhängt. Die App benötigt beim ersten Start immer lange. Vielleicht macht es Dinge auf, aber ich weiß nicht genau, was vor sich geht. Nach dem Löschen der Daten und dem anschließenden Hinzufügen des Widgets wurde die App also zum ersten Mal gestartet. Deshalb verlangsamte es sich und ich dachte, SharedPreferences würde es langsam machen. – Usman