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).
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
Wie hast du versucht Threading? Lebt der gesamte Code im Widget? –
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