Update UI von einem AsyncTaskLoader
Habe ich umgewandelt mein AsyncTask
zu einem AsyncTaskLoader
(meist zum Umgang mit änderungen in der Konfiguration). Ich habe eine TextView
ich bin mit so einem status und wurde mit onProgressUpdate
im AsyncTask
zu aktualisieren. Es sieht nicht wie AsyncTaskLoader
hat ein gleichwertiges, also während loadInBackground
(in der AsyncTaskLoader
) ich bin mit diesem:
getActivity().runOnUiThread(new Runnable() {
public void run() {
((TextView)getActivity().findViewById(R.id.status)).setText("Updating...");
}
});
Ich bin mit diesem in einem Fragment
, das ist, warum ich bin mit getActivity()
. Diese Arbeit ziemlich gut, außer, wenn eine änderung der Konfiguration geschieht, wie die änderung der Ausrichtung des Bildschirms. Meine AsyncTaskLoader
läuft (das ist, warum ich bin mit einem AsyncTaskLoader
), aber die runOnUiThread
scheint übersprungen.
Nicht sicher, warum es übersprungen wird oder wenn dies ist der beste Weg, um die Aktualisierung der Benutzeroberfläche von einer AsyncTaskLoader
.
UPDATE:
Ich landete Rückkehr zu einer AsyncTask
wie es scheint besser geeignet für die UI-updates. Wünschte, Sie könnte Zusammenführen, was zusammen mit einer AsyncTask
mit einem AsyncTaskLoader
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist tatsächlich möglich. Sie im Grunde brauchen, um eine Unterklasse der
AsyncTaskloader
und Umsetzung einerpublishMessage()
Methode, die eineHandler
zu liefern, die Fortschritte, die Botschaft für eine Klasse, die dieProgressListener
(oder was auch immer Sie es nennen wollen) Schnittstelle.Laden Sie diese für ein Beispiel: http://www.2shared.com/file/VW68yhZ1/SampleTaskProgressDialogFragme.html (mir Nachricht, wenn er offline geht) - dies wurde auf der Basis von http://habrahabr.ru/post/131560/
Emm... Sie sollten dies nicht tun.
denn wie eine anonyme Klasse Zugriff auf übergeordnete Klasse, Methode oder Feld ist durch die Lagerung einen unsichtbaren Verweis auf die übergeordnete Klasse.
zum Beispiel haben Sie eine
Activity
:den compiler wirklich erzeugt so etwas wie dieses:
So, wenn Sie Ihre Eltern
Activity
zerstört (aufgrund der Konfiguration ändern, zum Beispiel), und Ihre anonymen Klasse immer noch vorhanden ist, wird die ganze Aktivität nicht gc-ed. (weil jemand immer noch eine Referenz.), DIE ZU EINEM SPEICHERVERLUST UND MACHEN SIE IHRE APP GEHEN, LIMBO!!!
Wenn es mir war, würde ich die Umsetzung der "onProgressUpdate()" für Radlader wie dieser:
Und in Ihrem
Activity
Klasseerinnern zu
deleteObserver()
währendonDestroy()
ist wichtig, auf diese Weise die loader nicht über einen Verweis auf Ihre Tätigkeit für immer. (der loader wird wahrscheinlich am Leben gehalten werden während IhresApplication
lifecycle...)Beantwortung meiner eigenen Frage, aber von was ich sagen kann,
AsyncTaskLoader
ist nicht die beste zu verwenden, wenn Sie brauchen, um die Aktualisierung der Benutzeroberfläche.In der Klasse, in die Sie implementieren
LoaderManager.LoaderCallback
(vermutlich Ihre Aktivität), gibt es eineonLoadFinished()
Methode, die man überschreiben muss. Dies ist, was zurückgegeben wird, wenn dieAsyncTaskLoader
geladen wurde.onLoadFinished
aufgerufen, wenn derAsyncTaskLoader
fertig ist laden? Nicht ganz sicher, wie die Adressen mein Problem, aber ich bin neu inAsyncTaskLoaders
so kann ich etwas vermissen. IstonLoadFinished
entsprichtonProgressUpdate
in einemAsyncTask
?onPostExecute
onProgressUpdate
, so kann ich zeigen, den status, die als hintergrund-Prozess ausgeführt wird. Ich glaube nicht, dassAsyncTaskLoader
hat.Die beste Methode ist die Verwendung von LiveData, 100% Arbeiten
Schritt 1: Hinzufügen von lifecycle-Abhängigkeit oder verwenden Sie androidx Artefakte, da ja während der Projekt-Erstellung
Schritt 2: Erstellen der loader-Klasse wie folgt in der loader erstellen in öffentliche Methode zum setzen der livedata, dass beobachtet werden kann, von Aktivität oder fragment. finden Sie die setLiveCount Methode in meine loader-Klasse.
Schritt 3: Legen Sie die live-Daten aus Aktivität und beobachten Sie die änderung wie folgt
Hoffe, dies wird Ihnen helfen,:) happy coding