Ich versuche eine AsyncTask aus einer anderen AsyncTask doInBackground()
-Methode ...
Ist das überhaupt möglich? Wenn ja, wie kann ich das erreichen?
SPÄTER BEARBEITEN:
Die Idee ist, dass ich eine asynctask starte, die mir Status von Tweeter bekommt ... Alles in Ordnung bis hier ... Aber wenn ich einige spezifische Tweets treffe, muss ich sie mit einigen Informationen von meinem Server ändern, hier werde ich mache eine andere Netzwerkoperation, und da ich warten muss, bis ich die Informationen von meinem Server bekomme, mache ich:
%Vor%Dies wird von der bereits gestarteten AsyncTask in der doInBackground () Methode gestartet ...
Ich weiß, ich kann einfach die Methoden in der AsyncTask hinzufügen und sie nur in der doInBackground () Methode aufrufen, aber ich muss sie an anderen Stellen verwenden, wo ich diese AsyncTasks von onPostExecute ...
starteWenn ihr denkt, dass es eine einfache Lösung dafür gibt, wird das meine Leistung nicht beeinträchtigen, das wird großartig ... wenn nicht, werde ich einige statische Methoden machen, die ich in allen AsyncTasks aufrufen werde, die ich brauche (aber dazu muss ich viel Code ändern)
Laut dem Beitrag unten können Sie Activity.runOnUiThread () ausführen, um eine Runnable auf dem Haupt-Thread (aus einem anderen Thread) auszuführen.
Also könnten Sie das theoretisch tun:
Wie der Name sagt Activity.runOnUiThread () führt das Runnable im Haupt-Thread
ausAber es ist irgendwie hacky.
Code sollte in etwa so aussehen: (nicht testen)
%Vor%Dieses geschachtelte Beispiel ist kein guter Stil für die Produktion, da (IMHO) es nicht lesbar ist.
Zusätzliche Hinweise:
Activity.runOnUiThread (Runnable) ist nicht statisch! Deshalb verwendet mein Beispiel ParentActivity (.this) .runOnUiThread (Runnable).
AsyncTasks
sollen vom main -Tool laufen. Sie sollten keine AsyncTask von doInBackground ausführen, da diese Methode in einem Thread ohne Benutzeroberfläche ausgeführt wird.
In Ihrem Fall kann ich Ihnen zwei Dinge vorschlagen:
Sie können es nicht in doInBackground()
, aber Sie können von onProgressUpdate()
zum Beispiel, da es auf dem UI-Thread ausgeführt wird. Denken Sie daran, dass sie nach 3.0 in die gleiche Warteschlange gestellt werden und nicht parallel ausgeführt werden, siehe executeOnExecutor
Siehe die Dokumentation für AsyncTask()
und AsyncTask#execute()
. Beide geben an, dass sie im Hauptthread der Benutzeroberfläche aufgerufen werden müssen.
es ist nicht besser, diese paar inet-Aktionen zu nehmen und sie zu involvieren, indem Sie einen separaten Thread starten, der diesen Teil der Datenverwaltung behandelt? google überall setzen Sie es Muster, die, wenn Sie am nächsten sind sie alle von einfachen Klassen abgeleitet werden ... diese API macht Android wie ein Spinnennetz Rückruf mit Callback ... Versuchen Sie, Grundlagen von Java zu verstehen, und es wird nicht schwierig sein, ein Stück zu schreiben von gutem Code. Services / Content Resolver / Receivers / Loader sind irgendwie begrenzt ... Threads sind fast in der Lage, alles zu erreichen, was du willst ...
Die meisten von Ihnen benutzen den Code ohne nachzudenken und versuchen nicht einmal zu verstehen, wie es funktioniert, und zu verstehen, was der Programmierschlüssel ist. Ich versuche, keinen Code zu verwenden, dessen Grundlagen ich nicht kenne. Und wenn ich muss, habe ich es gründlich studiert. Ich habe Java für schwarze Magie benutzt, jetzt denke ich, es ist DATA FLOW A- & gt; B- & gt; C etc .. guter FLOW ist wesentlich .
BEARBEITEN:
Ja, ich habe die Lösung für Ihr Problem geschrieben
Es gibt viele Möglichkeiten, das zu erreichen, was du willst, aber es ist nicht meine Antwort auf den Writer-Code für dich
Sie können die IntentService-Klasse verwenden, für die eine eingebaute Warteschlange existiert --- verwenden Sie für jede Übertragung nur separate startService () -Aufrufe.
Sie können Thread - meinen bevorzugten Weg verwenden
Sie können den Service
Sie können AsyncTaskLoader
Benutze jedoch nicht die ASYNC TASK wenn du mehr als ZWEI brauchen, die bei ONCE miteinander verbunden sind alle auf MODERN PHONES RUNS als QUEUE auf a einzelner Thread (ps. Sie können sie auf EXECUOR als Workaround ausführen)
Da JAVA 1.5-Tasks von Threads getrennt sind - Es wurde hinzugefügt
Was meinst du mit benutzerdefinierten Thread
THREAD (wie wir es nennen) ist kein THREAD CLASS OBJECT, aber es ist eine TASK, die in der run () - Methode der THREAD CLASS definiert ist, so dass jede KLASSE, die von THREAD STILL STARTS THREAD (aka TASK) abgeleitet wird >
%Vor%gefällt das zum Beispiel in POSIX:
%Vor%Von diesem Punkt aus können wir über MULTITASKING sprechen, wenn das Betriebssystem mehrere Tasks über einen bestimmten Zeitraum ausführt, indem es sie gleichzeitig ausführt
seit JAVA 1.5 es ist eine Executor-Schnittstelle , die eine Möglichkeit bietet, die Aufgabenübertragung von den Mechanismen der Ausführung der einzelnen Aufgaben zu trennen, einschließlich Details zur Thread-Verwendung. Planung, usw. Executor wird normalerweise verwendet, anstatt explizit Threads zu erstellen. Sie haben viele Executoren, von denen einer: ThreadPerTaskExecutor
ist%Vor%Dieser Executor erzeugt für jede Aufgabe einen neuen Thread.
Zurück zu AsyncTask:
%Vor%ermöglicht die parallele Ausführung mehrerer Aufgaben in einem Pool von Threads, die von AsyncTask verwaltet werden. Sie können jedoch auch Ihren eigenen Executor für das benutzerdefinierte Verhalten verwenden.
und ja, wenn du es nicht magst und nicht genug weißt, tu es jemand anderem :)
Ich hoffe, dass dieser Zusatz Ihre Meinung über Ihre Stimme ändert.
Tags und Links android android-asynctask