AsyncTask - Hur fungerar det rent praktiskt?

Discussion in 'Frågor, support och diskussion' started by Figgy, Feb 10, 2012.

  1. Figgy

    Figgy Kid Droid Medlem

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

    MINA ENHETER

    För ett tag sedan ställde jag en fråga om hur man väntar på att en AsyncTask ska bli färdig.

    Jag sitter med lite av samma problem fortfarande, men saker och ting fungerar. Problemet jag har är att min AsyncTask loggar in en användare och synkroniserar lite information om denna (data hämtas från en XML server). Denna information laddas ner utan problem och hela flödet är OK. Dock får jag titt som tätt lite krasher just på grund av att min AsyncTask använder metoder i min aktivitet för att meddela om synkroniseringen lyckades eller inte.

    Detta är felmeddelandet
    02-10 10:28:41.191: E/WindowManager(2335): Activity com.xxxx.xxxxx.LoginActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4053e8f0 that was originally added here.

    Detta beror (vad jag tror) på att jag använder en statisk referens till min aktivitet för att kunna nå instansen. Det jag vill göra är någon form av callback från asynctasken till min aktivitet. Jag vill alltså hela tiden utgå från min aktivitet och därifrån starta bakgrundstråden och när denna är klar vill jag också att min aktivitet slutför jobbet med det resultat som tråden skickar tillbaka.

    Är AsyncTask fel väg att gå, eller går det att göra någon form av callback utan att spara en statisk referens till aktiviteten (då detta oftast fungerar, men inte alltid)?

    Eller har gröngölingen missförstått konceptet om bakgrundsprocesser?

    MvH
     
  2. mardox

    mardox Kid Droid Medlem

    Joined:
    Jan 31, 2010
    Messages:
    73
    Likes Received:
    6

    MINA ENHETER

    Hej,

    Som jag förstår det så borde du bara ta en till koll på AsyncTask documentationen(http://developer.android.com/reference/android/os/AsyncTask.html). Det finns nämligen två metoder som gör det du vill, onProgressUpdate() och onPostExecute() körs båda på samma tråd som startade AsyncTasken. onPostExecute() medelar när backgrundstråden är klar med sitt. onProgressUpdate() körs när publishProgress() anropas ifrån doInBackground().
     
    Figgy likes this.
  3. Figgy

    Figgy Kid Droid Medlem

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

    MINA ENHETER

    Jo, jag har koll på detta. Men hur får jag den informationen till aktivieteten utan att deklarera en statisk självreferens? Jag är medveten om .get() lika så men aktiviteten fryser ju vid användning av denna om tråden inte är färdig.

    De metoder som du nämner tillhör AsyncTask och har ingen koppling till min Aktivetet som startade AsynkTask'en om jag förstår allt rätt.

    MvH

    Edit: Ibland är man bra dum, jag skickar med aktiviteten i konstruktorn för asynctasken och det fungerar nu prima att komma åt aktivitetens metoder utan felmeddelanden. Förlåt om jag förvirrade lite.
     
    Last edited: Feb 10, 2012
  4. mardox

    mardox Kid Droid Medlem

    Joined:
    Jan 31, 2010
    Messages:
    73
    Likes Received:
    6

    MINA ENHETER

    Annars brukar jag vanligvis ha mina asynctasks som inre klasser till min Activity.
     
  5. Figgy

    Figgy Kid Droid Medlem

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

    MINA ENHETER

    Hur återanvänder man den i så fall? Låter det inte lite grötigt att bädda in flera objekt i samma.
     
    Last edited: Feb 13, 2012
  6. Hemoroid

    Hemoroid Baby Droid Medlem

    Joined:
    Apr 7, 2010
    Messages:
    26
    Likes Received:
    5

    MINA ENHETER

    Om synkroniseringen bara ska ske i en aktivitet så kan det vara rätt skönt att ha all kod samlad, men som du skrev så blir det bökigare att återanvända den. Då är det (enligt mig iaf) bättre att göra som du gjorde och skicka med en referens.