Att vänta på en AsyncTask

Diskussion i 'Frågor, support och diskussion' startad av Figgy, 12 jan 2012.

  1. Figgy

    Figgy Kid Droid Medlem

    Blev medlem:
    2 jan 2012
    Inlägg:
    61
    Mottagna gillanden:
    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:
    Kod:
    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

    Blev medlem:
    24 jun 2009
    Inlägg:
    36
    Mottagna gillanden:
    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 gillar detta.
  3. Figgy

    Figgy Kid Droid Medlem

    Blev medlem:
    2 jan 2012
    Inlägg:
    61
    Mottagna gillanden:
    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: 12 jan 2012
  4. Fredrik

    Fredrik Kid Droid Medlem

    Blev medlem:
    24 jun 2009
    Inlägg:
    36
    Mottagna gillanden:
    2

    MINA ENHETER

  5. Figgy

    Figgy Kid Droid Medlem

    Blev medlem:
    2 jan 2012
    Inlägg:
    61
    Mottagna gillanden:
    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

    Blev medlem:
    12 dec 2010
    Inlägg:
    113
    Mottagna gillanden:
    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

    Blev medlem:
    2 jan 2012
    Inlägg:
    61
    Mottagna gillanden:
    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

    Blev medlem:
    12 dec 2009
    Inlägg:
    1 594
    Mottagna gillanden:
    172

    MINA ENHETER

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

    woody Teen Droid Medlem

    Blev medlem:
    3 sept 2009
    Inlägg:
    319
    Mottagna gillanden:
    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

    Blev medlem:
    12 dec 2009
    Inlägg:
    1 594
    Mottagna gillanden:
    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.