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.
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? –
Czy możesz opublikować pełny kod miejsca, w którym tworzysz okno dialogowe? Wywołanie funkcji .show() w oknie dialogowym –
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. –