AsyncTask wohl doch nicht so klar

  • Hallo zusammen


    Ich habe danach gesucht, gibt ja viele Threads dazu hier. Jedoch wurde ich zu meinem "Problem" nicht fünidg. Ich hoffe das ist auch wirklich so, ansonsten endschuligt bitte.


    Allgemein ne coole Sache, in doInBackground wird in einem externen Thread alles gewerkelt und in onPostExecute kann man dann über die zurückgegebene Variable von doInBackground die Sachen an der GUI verarbeiten. Soweit alles klar.


    Jetzt habe ich aber folgendes. Ich habe einen AsyncTask und IM onPostExecute von diesem wieder einen Aufruf für andere AsyncTask.
    Jetzt habe ich festgestellt, das das onPostExecute vom zweiten AsyncTask erst aufgerufen wird, wenn das vom ersten fertig ist. Jetzt wo ich das gerade schreibe, wird mir auch klar warum, ist ja dann wieder im gleichen Thread.


    Ich habe eben folgendes Grundproblem. In meinem onPostExecute vom Hauptasynctask steht folgendes:

    Code
    new Group_CreateGenerallyGroupIfNotExist().execute(user);
                	while (!c_Glob_Variables.CheckForFinishedCheckGenerallyGroup_Get()) {
                    	try { Thread.sleep(100); }
                    	catch (InterruptedException e) { e.printStackTrace(); }
                	}


    Ich will das der onExeCute von der HauptAsyncTask erst weiter macht wenn der zweite komplett fertig ist und den Boolean demnach verändert hat. Aber so entsteht ein deadlock. Wie macht man das also? :/ Order geht sowas nicht?


    Ich hoffe ich habe es verständlich ausgedrückt :D


    Gruss Black Rider

  • Hey :)


    Ja, danach kommt der Auftruf der nächsten Activity. Welche noch nicht alle Daten hätte, wenn ich nicht auf die Beendigung des zweiten AsyncTask warten würde, was ja aber nicht geht, da dieser erst beendet werden kann, wenn der mit dem onPostExecute vom ersten AsyncTask raus ist.


    Meine grundelegende Frage ist, ob es nicht möglich ist, das onPostExecutes von "subasynctask" aufgerufen werden können wenn er noch im Codeblock (onPostExecute) vom hautasynctask ist?


    Ich glaube ich muss es einfach grundlegend anders programmieren....

  • Zitat

    Ja, danach kommt der Auftruf der nächsten Activity.


    Dann passt meine Lösung, oder?



    Zitat

    Meine grundelegende Frage ist, ob es nicht möglich ist, das onPostExecutes von "subasynctask" aufgerufen werden können wenn er noch im Codeblock (onPostExecute) vom hautasynctask ist?


    Die Frage ist eher, warum du das so haben willst :P
    Angenommen, dein ursprünglicher Code würde soweit funktionieren: da wäre der Sinn des Tasks direkt wieder dahin, weil du mit dem while()/sleep() doch wieder den MainThread blockierst...
    da kannste dann genau so gut das while() durch den Inhalt des doInBackground() ersetzen.

  • Zitat

    Angenommen, dein ursprünglicher Code würde soweit funktionieren: da wäre
    der Sinn des Tasks direkt wieder dahin, weil du mit dem while()/sleep()
    doch wieder den MainThread blockierst...


    da kannste dann genau so gut das while() durch den Inhalt des doInBackground() ersetzen.

    Jop, das kam mir heute morgen auch in den Sinn. Ich habe jetzt alles in ein AsyncTask gesteckt. Musste halt einfach schon vorher die ganzen Variablen aus der UI fischen und mittels Parameter an den Konstrukteur des AsyncTask übergeben.


    Fazit:
    1. In onPostExecute keine AsyncTask Aufrufe, ausser wenn die Beendigung für den zeitlichen Verlauf keine Rolle spielt.
    2. Von Userinput (Button Click) bist GUI Update (Z.B: Nächstes Activity) muss alles in ein AsyncTask.


    Dank Dir für die Hilfestellung :)


    Gruss


    Black Rider

  • Zitat

    Von Userinput (Button Click) bist GUI Update (Z.B: Nächstes Activity) muss alles in ein AsyncTask.


    ...oder du verkettest die Tasks halt miteinander:
    1. lange laufende Aktion #1
    2. lange laufende Aktion #2
    3. nächste Activity


    wird aufgedröselt in:


    async1.doInBackground: lange laufende Aktion #1
    async2.doInBackground: lange laufende Aktion #2


    async1.post: async2.exec
    async2.post: nächste Activity


    womit der ursprüngliche Code dann zu
    1. async1.exec
    wird.


    Zitat

    Dank Dir für die Hilfestellung


    Gerne.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!