Ich weiß, dass dies die Frage ist, die viele Male gestellt wurde. Allerdings gibt es etwas, auf das ich nie eine Antwort gefunden habe. Hoffentlich kann mir jemand etwas Licht geben.
Wir alle wissen, dass AsyncTask und Thread Optionen zum Ausführen von Hintergrundaufgaben sind, um ANR-Probleme zu vermeiden. Es wird empfohlen, dass asynctask nur für kurz laufende Aufgaben verwendet wird, während thread für lang andauernde Aufgaben verwendet werden kann. Die Gründe, warum asynctask nicht für lange Aufgaben verwendet werden sollte, sind wohlbekannt, was auf das mögliche Leck hinweist, das von asynctask verursacht wird, da es möglicherweise weiterläuft, nachdem eine Aktivität zerstört wurde. Das ist überzeugend. Es führt jedoch auch zu einigen anderen Fragen:
Danke
Da niemand antwortet. Ich beantworte dann meine eigenen Fragen.
AsyncTask
nur für kurze Aufgaben (etwa 5 Sekunden) empfohlen wird, ist, dass es keine Methode zum Abbrechen einer laufenden AsyncTask
gibt. Es gibt eine Methode namens AsyncTask.cancel(true)
, die onCancelled(Result result)
aufruft. Laut der Dokumentation wird diese Methode jedoch "auf dem UI-Thread ausgeführt, nachdem cancel (boolean) aufgerufen wurde und doInBackground (Object []) beendet wurde." ( Ссылка ). Auf der anderen Seite kann Thread
mit Thread.interrupt()
gestoppt werden. AsyncTask
in einem Service
auszuführen, vorausgesetzt, Sie kennen die Abbruchbegrenzung von AsyncTask
und die Möglichkeit eines Speicherlecks kann durch AsyncTask
erzeugt werden. Beachten Sie, dass es natürlich nicht notwendig ist, ein AsyncTask
in einem IntentService
zu verwenden, das bereits in einem Worker-Thread ausgeführt wird. RxJava
die ganze Zeit, ohne ein Problem zu haben. Beachten Sie, dass dasselbe Speicherleckproblem auch auf RxJava
angewendet wird. Sie können vielleicht eine der spezifischen Fragen hier finden. Es gibt auch eine ganze Reihe von Diskussionen über die Handhabung von Leaking / Screen Rotation mit RxJava
, die von Google einfach gefunden werden können. AsyncTask und Thread + Handler sind nicht sorgfältig entworfen und implementiert. RxJava, Akka und andere Frameworks für asynchrone Ausführung scheinen sorgfältiger entwickelt zu sein.
Jede Technologie hat ihre Grenzen. AsyncTask ist für eine einzelne parallele Aufgabe mit der Möglichkeit, den Fortschritt auf der Benutzeroberfläche anzuzeigen. Wenn die Aktivität jedoch neu generiert wird (z. B. weil sich der Bildschirm dreht), geht die Verbindung zur Benutzeroberfläche verloren (eine mögliche Lösung für dieses Problem ist Ссылка ).
Thread+Handler
behält Speicher für den Thread-Stack, auch wenn keine zu verarbeitenden Nachrichten vorhanden sind. Dies begrenzt die mögliche Anzahl von Threads. Sie können viel mehr Akka actors
oder RxJava Subscribers
als Handler-Threads mit ähnlicher Funktionalität haben.
Tags und Links android multithreading android-asynctask rx-java android-handler