Starte AsyncTask aus einem anderen AsyncTask doInBackground()
Ich versuche zu starten ein AsyncTask aus einem anderen AsyncTask ist doInBackground()
-Methode...
Ist das überhaupt möglich? Wenn ja, wie kann ich das erreichen?
SPÄTER BEARBEITEN:
Die Idee ist, dass ich starten Sie eine asynctask das wird mich Status vom Hochtöner ... Alles ok, bis hier ... Aber wenn ich stoßen einige spezifische tweets, die ich brauche, Sie zu ändern mit ein paar Infos von meinem server, hier werde ich ein anderes Netz-Betrieb, und da muss ich warten bis ich die info von meinem server mache ich:
GetContent getContentServiceAsyncTask = new GetContent(context);
try {
tweetText = Uri.decode(getContentServiceAsyncTask.execute(
URL_GET_CONTENT, jsonRequest).get());
} catch (InterruptedException e) {
Log.e(TAG_DEBUG, "InterruptedException: ", e);
} catch (ExecutionException e) {
Log.e(TAG_DEBUG, "ExecutionException: ", e);
}
Dies ist, begann bereits begonnen AsyncTask in der doInBackground () - Methode ...
Ich weiß, ich kann nur hinzufügen, dass die Methoden in der AsyncTask und rufen Sie in der doInBackground () - Methode, aber ich brauche, um Sie in anderen Orten, wo ich beginnen diese AsyncTasks von onPostExecute ...
Wenn Sie Jungs denken, dass es einen einfachen work-around für diese, das wird keinen Einfluss auf meine Leistung, das wird groß sein ... wenn nicht mache ich einige statische Methoden, die ich nenne, in allen AsyncTasks, die ich brauche(aber das wird von mir verlangen, Sie zu ändern sehr viel von meinem code)
- warum wollen Sie das tun? developer.android.com/reference/android/os/AsyncTask.html. überprüfen Sie das Thema threading Regeln
- Es ist möglich, aber es wird Abstürzen, wenn Sie versuchen, ändern der Benutzeroberfläche von onPostExecute auf die zweite Aufgabe: es ist nicht die Ausführung im Haupt-thread.
- WENN Ihre zweite Aufgabe nicht enthält UI-operation, können Sie beginnen.
- Seine ratsam, start async-post ausführen der ersten async.
- Wenn keine der gegebenen Antworten war hilfreich, fühlen Sie sich frei, das zu akzeptieren 🙂
- meine zweite Aufgabe enthält nicht-UI-Bedienung ... können Sie erklären, wie kann ich es tun ?
- Hi schwarz, dein Erster async-task muss ausgeführt werden, auf parallelen Aufgabe artitecture. So starten Sie Ihre erste Aufgabe mit executor ==> "neue FirstTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, <Parameter>");" Zweite Aufgabe führen Sie in Ihrem firsttask ist doInbackgreound(). Erstelle ich Beispiel-app, und schreiben Sie die Antwort.
- Ich brauche keine parallele Ausführung, da, wie Sie sehen können, dass ich mit get() für den innen-AsyncTask... auch die executor wurde in API-level 11 ist das nicht gut für mich, denn meine app hat Unterstützung für den unteren Ebenen auch .. Aber immer noch eine gute Antwort ... danke
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut dem post weiter unten können Sie tun Aktivität.runOnUiThread() zum ausführen einer Runnable auf dem main-Thread (aus einem anderen thread).
Also theoretisch könnte man dies tun:
Wie der name schon sagt-Aktivität.runOnUiThread() führt den Thread auf der main-thread
Aber es ist eine Art hacky.
Code sollte in etwa so Aussehen: (nicht test)
Diese verschachtelte Beispiel ist kein guter Stil in der Produktion verwenden, weil (IMHO) seine Nähe nicht lesbar.
Zusätzliche Hinweise:
Aktivität.runOnUiThread(Runnable) ist nicht statische! Thats, warum mein Beispiel verwendet ParentActivity(.diese).runOnUiThread(Runnable).
public class DoSomeBackgroundWork extends AsyncTask<String, String, Boolean> {...}
AsyncTasks
sollen laufen aus main (UI) - thread. Sie sollten nicht ausgeführt werden ein weiterer AsyncTask von doInBackground, weil diese Methode wird ausgeführt, auf einem nicht-UI-thread.In Ihrem Fall, kann ich schlagen Sie zwei Dinge:
Können Sie es nicht in
doInBackground()
aber man kann vononProgressUpdate()
zum Beispiel, da läuft es auf dem UI-thread. Nur Bedenken Sie, dass nach 3.0 werden Sie setzen auf der gleichen Warteschlange und wird nicht parallel ausgeführt werden, siehe executeOnExecutorFinden Sie in der Dokumentation für
AsyncTask()
undAsyncTask#execute()
. Beide geben an, dass Sie aufgerufen werden müssen, auf die Haupt-UI-thread.AsyncTask
statt. jmeier, die Antwort gibt eine Möglichkeit, dies zu tun.Im Grunde Probe, die ich geschrieben habe;
Seine einfache, verwenden Sie einen Testamentsvollstrecker:
new AsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new String[]{"param 1", "param 2"});
ist es nicht besser, diese paar inet Aktionen und beteiligt Sie durch starten Sie einen separaten Thread, behandelt dieser Teil der Daten-management ?
google überall gesagt ist es Muster, die, wenn u look am nächsten-Sie alle sind abgeleitet von der einfachen Klassen... diese API lässt android wie ein spider-web-callback mit Rückruf... Versuchen Sie zu verstehen, die Grundlagen von java und es wird nicht schwer sein, zu schreiben, ein Stück, guten code. Dienstleistungen/content Resolver/Empfänger/Lader begrenzt sind irgendwie... Threads sind fast in der Lage, etwas zu erreichen, was u wollen...
Meisten von Euch verwendet den code, ohne zu denken, und nicht einmal versuchen zu verstehen, wie es funktioniert, und zu verstehen, was die Programmier-Taste. Ich versuche, nicht zu verwenden code, dessen Grundlagen ich weiß nicht. Und wenn ich muss, ich studierte es gründlich. Ich verwendet Java für die schwarze Magie jetzt denke ich, es ist, Datenfluss, EIN-> B-> C, etc .. gute STRÖMUNG ist wichtig.
EDIT:
ja, ich habe die Lösung für Sie-problem
gibt es viele Möglichkeiten, um zu erreichen, dass das, was u wollen, aber es ist nicht meine Antwort auf Schriftsteller-code für Sie
können Sie IntentService Klasse es hat einen built-in Warteschlange --- benutzen Sie einfach ein separates startService () - Aufrufe für jede übertragung.
können Sie Thread - meine bevorzugte Art
können Sie Service
können Sie AsyncTaskLoader
aber nicht verwenden ASYNC TASK, wenn u brauchen Feuer mehr als ZWEI miteinander verbunden und auf EINMAL Sie alle auf MODERNEN HANDYS LÄUFT, wie die WARTESCHLANGE auf einem einzigen thread (ps. Sie können führen Sie auf EXECUOR als workaround)
Seit JAVA 1.5 Aufgaben sind getrennt von threads
- es wurde Hinzugefügt,
was du meinst mit custom thread
THREAD (wie wir sprechen) ist keine THREAD-KLASSE-OBJEKT, aber es ist eine AUFGABE definiert, in die run () - Methode der THREAD-KLASSE, so dass jede KLASSE, ABGELEITET von THREAD NOCH STARTET THREAD (aka TASK)
wie dies zum Beispiel in POSIX :
ab diesem Punkt können wir reden MULTITASKING, wenn OS ist die Durchführung mehrerer Aufgaben über einen bestimmten Zeitraum, indem Sie ausführt, die gleichzeitig
seit JAVA 1.5 ther ist ein Executor interface, die bietet eine Möglichkeit der Entkopplung der Aufgabe, Veröffentlichungen aus der mechanik, wie jede Aufgabe ausgeführt werden, einschließlich der Einzelheiten der thread nutzen, Terminierung, etc. Testamentsvollstrecker ist in der Regel verwendet, anstatt explizit erstellen von threads. Sie haben viele Vollzieher einer von Ihnen ist: ThreadPerTaskExecutor
immer wieder zu AsyncTask:
und ja, wenn Sie nicht das Gefühl bis zu es und nicht genug wissen beeter, um jemand anderes zu tun es 🙂