2013-03-07 12 views
6

Mam kilka prywatnych metod AsyncTask, które chciałbym włamać się do publicznych klas zewnętrznych. W mojej aplikacji mam publiczną klasę rozszerzającą Application, która przechowuje pewne wspólne procedury, do których chcę uzyskać dostęp z różnych części mojej aplikacji. Kiedy jednak przerywam klasę AsyncTask, nie mogę już wywoływać metody getApplicationContext(), aby uzyskać odwołanie do mojej biblioteki aplikacji (klasa nie dziedziczy teraz niczego od działania). Funkcja getBaseContext() również będzie miała problemy. Czy powinienem przekazywać kontekst do AsyncTask, gdy zostanie on utworzony i zbudowany z tego? Nie jestem pewien, czy to było bezpieczne, czy nie.getApplicationContext w klasie AsyncTask?

import java.util.ArrayList; 
import android.os.AsyncTask; 

public class DlTask extends AsyncTask 
{ 
    long totalbytes = 0; 
    long totalread = 0; 
    ArrayList <String> data; 

    @Override 
    protected void onPreExecute() 
    { 
     AppLib lib = (AppLib) getApplicationContext(); 

     lib.saveStatusText ("Contacting " + lib.getServerAddress() + ":" + lib.getServerPort() + "..."); 
     super.onPreExecute(); 
    } 

     @Override 
     protected Object doInBackground (Object... params) 
     { 
     data = lib.sendCommand (CMD_LIST); 
     return true; 
     } 

     @Override 
     protected void onPostExecute (Object result) 
     { 

     if (data != null) 
     { 
        lib.saveStatusText (data.size() + " files found"); 
     } 
     else 
     { 
      Log.d (TAG, "data is null"); 
      Toast.makeText (getBaseContext(), msg, Toast.LENGTH_SHORT).show();      
     } 

     super.onPostExecute(result); 
     } 

} 
+1

Powinieneś przechodzić w kontekście w konstruktorze. –

+0

należy używać konstruktora AsyncTask z kontekstowymi. – Ashok

Odpowiedz

9

powinienem być przechodzącą kontekst do AsyncTask gdy robi instancja i budować stamtąd?

Nie masz wyboru, ponieważ nie będziesz w stanie uzyskać Context w jakikolwiek inny sposób.

+0

Czy możesz rozwinąć @CommonsWare? Dlaczego funkcja 'getApplicationContext()' nie działa z części interfejsu "AsyncTask" w interfejsie użytkownika? (ex: 'onPreExecute()' lub 'onPostExecute()') Ten link 'sugeruje', że może działać, ale moja rzeczywistość pokazuje, że nie będzie się kompilować (Sdk 8-17); http://www.daniweb.com/software-development/mobile-development/threads/449375/how-to-get-context-in-asynctask – donfede

+1

@donfede: "Dlaczego metoda getApplicationContext() nie działa z części interfejsu użytkownika AsyncTask? " - ponieważ 'getApplicationContext()' jest metodą na 'Context', a' AsyncTask' nie dziedziczy po 'Context'. – CommonsWare

+2

Czy to nie spowoduje wycieku, jeśli działanie zostanie zniszczone przed zakończeniem asynctask? – MikeIsrael

0

Przepuść kontekst w konstruktorze AsyncTask lub użyj zmiennej statycznej w swojej klasie aplikacji, aby uzyskać do niej dostęp (ustaw sMyInstace = this;). Pierwsze rozwiązanie jest jednak lepsze.

0

Powinieneś to zrobić. W moim przypadku działa:

public class DlTask extends AsyncTask { 
    private Context context; 

    public DlTask(Context context) { this.context = context; } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     .......... 
    } 

    @Override 
    protected Object doInBackground (Object... params) 
    { 
     data = lib.sendCommand (CMD_LIST); 

     return true; 
    } 

    @Override 
    protected void onPostExecute (Object result) 
    { 

     if (data != null) 
    { 
     lib.saveStatusText (data.size() + " files found"); 
    } 
    else 
    { 
     Log.d (TAG, "data is null"); 
     Toast.makeText (context, msg, Toast.LENGTH_SHORT).show();    
     //You can use the CONTEXT like this (passing the context variable like parameter 
    } 

    super.onPostExecute(result); 
    } 
Powiązane problemy