2016-08-17 2 views
1

Ich habe eine AsyncTask, die eine Methode einer anderen Klasse aufruft (wo sich die gesamte Berechnungslogik befindet), die einige Hintergrundoperationen ausführt. Ich möchte den Status/Fortschritt der Operation anzeigen. Ich weiß, dass wir publishProgress() in doInBackground() aufrufen können, um den Fortschritt im UI-Thread zu veröffentlichen. Aber da die Logik in einer anderen Klasse liegt, muss ich die Instanz einer AsyncTask übergeben, um von dort aus publishProgress() aufzurufen.Ist es gut, eine AsyncTask-Instanz an eine Methode in einer anderen Klasse zu übergeben, um den Fortschritt zu veröffentlichen?

Ist es ein richtiger Weg? Wird es verursachen Laufzeitproblem oder Speicherleck?

Wenn jemand dies durchgemacht hat, bitte leiten Sie mich an, dies in einer angemessenen Weise zu erreichen.

Edit1: Im AsyncTask Ich rufe einen SOAP Webservice

+1

Verwenden Sie _interface_ – Piyush

+0

@PiyushGupta: Wird es Speicherleck verursachen? Berücksichtigung eines Szenarios, wenn die Orientierung geändert wird. –

+0

@Rithe: Ich benutze das bereits. Es ist eine Rückrufmethode. Aber wir müssen 'publishProgress (someValue)' in 'doInBackground()' aufrufen, um es auszulösen. –

Antwort

0

Es ist nicht gute Idee AsyncTask überhaupt zu benutzen - es ist veraltet. Verwenden Sie rxJava Bibliothek stattdessen

+1

Warum sagen Sie, dass es veraltet ist? –

+0

Weil es (AsyncTask) kann nur etwas Arbeit im Hintergrund Thread (Sie auch Thread-Pool zur Verfügung stellen) und verarbeitet Ergebnisse auf Haupt-Thread. In rxJava können Sie Daten in einem Thread erstellen, sie in einer anderen Berechnung (in der Regel Schedulers.io() und Scheduler() verarbeiten, aber Sie können einen benutzerdefinierten Scheduler aus HandlerThread erstellen) und dann die Ergebnisse in einem anderen Thread behandeln. Sie können auch Ergebnisse von wenigen Aufgaben zusammenführen, etc. Retrofit2 unterstützt rxJava, es ist also sehr praktisch, wenn Sie REST API verwenden –

+1

Ich stimme Ihnen zu. Tatsächlich verwende ich Retrofit + RxJava in meinen Projekten, nicht AsyncTask. Retrofit + RxJava ist eine bessere Lösung, aber es ist kein Grund, warum AsyncTask veraltet ist. Die Verwendung dieses Stacks (Retrofit + RxJava) beinhaltet mehr Abhängigkeiten zum Projekt und in einigen Fällen könnte besser AsyncTask zur Vereinfachung verwendet werden. –

-1

Wie ich in Ihrer Frage verstehe, haben Sie eine Methode, die Sie von DoInBackground aufrufen, wenn diese Methode nicht außerhalb dieser Methode Bereich (in Mitglied oder statisches Mitglied oder in einem Mitglied eines statischen Mitglieds etc.) speichert) als es rational ist, zu sagen, dass die Ausführung selbst die AsyncTask und den Kontext nicht verliert, auf den von ihr verwiesen wird. Aber es gibt noch mehr dazu, selbst wenn das obige der Fall ist, haben Sie immer noch so viele Möglichkeiten, dass diese AsyncTask auslaufen würde.

+0

Gibt es eine Alternative? –

+0

IntentService in Verbindung mit EventBus –

+0

Kann EventBus nicht mit AsyncTask verwendet werden? Wenn ja, was ist der Unterschied zwischen den beiden Ansätzen? Was ist effizient und weniger anfällig für Speicherlecks? –

Verwandte Themen