Att vänta på en AsyncTask

Discussion in 'Frågor, support och diskussion' started by Figgy, Jan 12, 2012.

  1. Figgy

    Figgy Kid Droid Medlem

    Joined:
    Jan 2, 2012
    Messages:
    61
    Likes Received:
    11

    MINA ENHETER

    Hur gör jag för att i min aktivetet få tillbaka resultatet (boolean) av en AsyncTask, och samtidigt vänta på resultatet utan att frysa aktiviteten?

    Just nu kör jag med:
    Code:
    AsyncTask task = new MyAsyncTask....execute("string");
    Men då fryser aktiviteten under körningen, och vad jag ser kan jag inte komma åt resultatet via 'task'?

    Min AsyncTask innehåller endast metoden boolean doInBackground(String... param) och jag har försökt med onPostExecute() metoden, men den kommer inte åt aktiviteten som startade denna tråd vilket gör den ointressant för mig.

    Hur gör jag i min aktivitet för att vänta på att denna task ska bli färdig utan att frysa appen, och samtidigt få tillbaka värdet?
    MvH
     
  2. Fredrik

    Fredrik Kid Droid Medlem

    Joined:
    Jun 24, 2009
    Messages:
    36
    Likes Received:
    2

    MINA ENHETER

    Använd onPostExecute + ProgressDialog

    Enklast är att deklarera din task inuti din aktivitet så får du automatiskt access till aktivitetens variabler osv, alternativt skicka med dina beroenden när du skapar din task och använd dem i onPostExecute
     
    Figgy likes this.
  3. Figgy

    Figgy Kid Droid Medlem

    Joined:
    Jan 2, 2012
    Messages:
    61
    Likes Received:
    11

    MINA ENHETER

    Kan du ge ett litet kortare exempel på det? Du nämner ProgressDialog - kommer den i så fall visa en dialog medans uppgiften körs?

    Jag använder en ToggleButton som ska vara aktiverad (och oklickbar) under körningen som indikering. När uppgiften är klar ska denna togglebutton avaktiveras och bli klickbar igen.

    Detta har jag löst med en onclick i layouten som anropar en metod i aktiviteten, det är denna metod som startar asynctask'en som ligger i en egen klassfil. Men jag bör alltså bädda in uppgiften i min metod istället? Tycker det blir så mycket spagettikod.

    Edit: Värt att nämna är också att jag tänkte köra med while() om det handlar om variabler, dock känns det som att det också kommer frysa aktiviteten.
     
    Last edited: Jan 12, 2012
  4. Fredrik

    Fredrik Kid Droid Medlem

    Joined:
    Jun 24, 2009
    Messages:
    36
    Likes Received:
    2

    MINA ENHETER

  5. Figgy

    Figgy Kid Droid Medlem

    Joined:
    Jan 2, 2012
    Messages:
    61
    Likes Received:
    11

    MINA ENHETER

    Det löste det hela! Dock gick det inte att returnera ett booleanskt värde i doInBackground() vilket fick mig att klia ordentligt på huvudet, jag ändrade det till integer.
     
  6. Senap

    Senap Youth Droid Medlem

    Joined:
    Dec 12, 2010
    Messages:
    113
    Likes Received:
    13

    MINA ENHETER

    Testade du "Boolean" istället för "boolean" (dvs objekt-wrappern av boolean)? Jag minns inte 100% men tror att det fungerar då.
     
  7. Figgy

    Figgy Kid Droid Medlem

    Joined:
    Jan 2, 2012
    Messages:
    61
    Likes Received:
    11

    MINA ENHETER

    Det var wrappern jag använde. Av någon anledning körs inte onPostExecute() när man använder den wrappern.
     
  8. ViLANDER

    ViLANDER Senior Droid Medlem

    Joined:
    Dec 12, 2009
    Messages:
    1 594
    Likes Received:
    172

    MINA ENHETER

    Då får du ändra typerna när du extendar AsyncTask.
     
  9. woody

    woody Teen Droid Medlem

    Joined:
    Sep 3, 2009
    Messages:
    319
    Likes Received:
    19

    MINA ENHETER

    Låter farligt... Risken är att man råkar pilla på dessa variabler på ett icke-trådsäkert sätt. Jag skulle hålla activityn och tasken åtskilda så slipper jag göra misstag.
     
  10. ViLANDER

    ViLANDER Senior Droid Medlem

    Joined:
    Dec 12, 2009
    Messages:
    1 594
    Likes Received:
    172

    MINA ENHETER

    Jag håller med. Det beror i och för sig på om man pillar på det i doInBackground() eller inte. onPreExecute(), onPostExecute() och onProgressUpdate() ska inte vara några problem.