6

Zdefiniowałem osobny wątek, rozszerzając klasę AsyncTask. W tej klasie wykonuję niektóre toasty i dialogi w metodach AsyncTask: onPostExecute i onCancelled. Grzanki wymagają kontekstowego aplikacji tak, że wszystko, co musisz zrobić, to:Jaki jest najlepszy sposób uzyskiwania/używania kontekstu w AsyncTask?

Toast.makeText(getApplicationContext(),"Some String",1); 

Dialogi są tworzone przy użyciu AlertDialog.Builder który wymaga również kontekst, w jego konstruktora. Czy mam rację, sądząc, że ten kontekst powinien być kontekstem działania? tj

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

gdzie getActivity mogą być zdefiniowane przez użytkownika klasy, który zwraca bieżące aktywność. Jeśli tak, jaki jest najlepszy sposób na poradzenie sobie z tą sytuacją? Tworzenie klasy takiej jak getActivity lub przekazywanie kontekstu bieżącej aktywności do konstruktora AsyncTask?

Zgaduję, że próbuję zrozumieć użycie Context - Zauważyłem, że wycieki pamięci mogą być problemem (nie do końca to rozumiem) i jak używanie getApplicationContext() jest najlepszym podejściem tam, gdzie to możliwe.

Odpowiedz

12

Wystarczy utworzyć AsyncTask jako wewnętrznej klasy swojej działalności, lub przekazać kontekst do konstruktora AsyncTask.

klasa wewnętrzna: MyActivity.java

public class MyActivity extends Activity { 

    // your other methods of the activity here... 


    private class MyTask extends AsyncTask<Void, Void, Void> { 

     protected Void doInBackground(Void... param) { 

      publishProgress(...); // this will call onProgressUpdate(); 
     } 

     protected Void onProgressUpdate(Void... prog) { 

      Toast.makeText(getActivity(), "text", 1000).show(); 
     } 
    } 
} 

Konstruktor: MyTask.java

public class MyTask extends AsyncTask<Void, Void, Void> { 

    Context c; 

    public MyTask(Context c) { 
      this.c = c; 
    } 

    protected Void doInBackground(Void... param) { 

      publishProgress(...); // this will call onProgressUpdate(); 
    } 

    protected Void onProgressUpdate(Void... prog) { 
      Toast.makeText(c, "text", 1000).show(); 
    } 
} 

Ponadto, proszę nie zapomnij połączeń .Show() na swojej Dialog .

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
builder.show(); 
+0

Dzięki Phil. Mój AsyncTask jest obecnie wewnętrzną klasą mojej aktywności (jak pokazano powyżej). Jednakże, chociaż działa to w przypadku 'Toast.makeText (getApplicationContext(), ...' w metodach interfejsu użytkownika 'MyTask'' AlertDialog.Builder (getApplicationContext()) 'nie działa. Zakładam, że dzieje się tak dlatego, że nie jest uzyskanie odpowiedniego kontekstu? Czy zatem nie jest wymagane przekazywanie kontekstu działania do konstruktora MyTask? Czy coś mi brakuje? –

+0

Czy możesz opublikować pełny kod miejsca, w którym tworzysz okno dialogowe? Wywołanie funkcji .show() w oknie dialogowym –

+0

Okay, tak! Oba 'Toast' i' AlertDialog' działają podczas przekazywania kontekstu do konstruktora MyTask, jak pokazano powyżej, tj. tworzenie instancji 'MyTask' przy użyciu' MyTask (this) 'od zdarzenia onClick w głównym działaniu.Tak, więc muszę tylko wyjaśnić:' MyTask (this) 'przekazuje kontekst działania do' MyTask', który może być użyty zarówno przez 'Toast' i' AlertDialog'. , podczas gdy 'Toast' może używać kontekstu aplikacji za pomocą' getApplicationContext() ',' AlertDialog' nie może, to znaczy, że potrzebuje s kontekście działalności - myśl, że tam właśnie szedłem źle. –

Powiązane problemy