Starten Sie AsyncTask von einer anderen AsyncTask doInBackground ()

7

Ich versuche eine AsyncTask aus einer anderen AsyncTask doInBackground() -Methode ...

zu starten

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 ...

starte

Wenn 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)

    
Ionut Negru 22.10.2013, 14:27
quelle

6 Antworten

10

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:

  • Führen Sie die Async-Aufgabe
  • aus
  • Führe Activity.runOnUiThread ( Runnable ) in deiner AsyncTask aus und starte eine neue AsyncTask innerhalb dieses runnable

Wie der Name sagt Activity.runOnUiThread () führt das Runnable im Haupt-Thread

aus

Aber 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).

    
Langusten Gustel 22.10.2013, 14:37
quelle
14

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:

  1. Kombinieren Sie die Verarbeitung Ihrer beiden AsyncTaks in einer einzigen Anfrage
  2. Starten Sie Ihre zweite AsyncTask von onPostExecute Ihrer ersten Aufgabe.
waqaslam 22.10.2013 14:30
quelle
6

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

    
Dan Pena 22.10.2013 14:34
quelle
0

Siehe die Dokumentation für AsyncTask() und AsyncTask#execute() . Beide geben an, dass sie im Hauptthread der Benutzeroberfläche aufgerufen werden müssen.

    
Alex Lockwood 22.10.2013 14:41
quelle
0

Grundsätzlich Probe habe ich geschrieben;

%Vor%     
nurisezgin 23.10.2013 05:00
quelle
-1

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

  • verwenden
  • Sie können AsyncTaskLoader

  • verwenden
  • 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.

    
ceph3us 02.07.2015 22:32
quelle

Tags und Links