Ostatnio przekonwertowałem Moje działania na fragmenty.Fragmenty wymieniane podczas wykonywania zadania AsyncTask - Wyjątek NullPointerException na getActivity()
Używając czegoś podobnego do nawigacji w karcie fragmenty są zastępowane, gdy użytkownik wybierze inną kartę. Po wypełnieniu fragmentu uruchamiam co najmniej jedną AsyncTask, aby uzyskać pewne informacje z Internetu. Jednak - jeśli użytkownik przełączy się na inną kartę tak jak doBackground-metoda z mojego AsyncTask jest wykonywany - fragment jest zastąpiony a więc jestem coraz NullPointerException
w zaznaczonych wierszach:
@Override
protected Object doInBackground(Object... params) {
...
String tempjson = helper.SendPost(getResources().getText(R.string.apiid)); //ERROR: Fragment not attached
...
}
protected onPostExecute(Object result) {
...
getActivity().getContentResolver() //NULLPOINTEREXCEPTION
getView().findViewById(R.id.button) //NULL
...
}
getActivity()
i getResources()
powoduje błąd, ponieważ mój Fragment jest zastępowany.
Czego próbowałem:
- anulować Wywołanie metody na moim AsyncTask (nie będzie naprawić pierwszy błąd, ani drugi błąd, jeśli fragment otrzymuje podczas
onPostExecute()
jest wykonywany) - sprawdzenie czy
getActivity()
jestnull
lub dzwoniącthis.isDetached()
(a nie prawdziwy dylemat i że muszę to sprawdzić, gdy zadzwonięgetActivity()
i tak dalej)
Moje pytanie brzmi: jaki byłby najlepszy sposób na pozbycie się problemów związanych z AsyncTask? Te problemy nie wystąpiły podczas używania działań, ponieważ nie zostały "zabite"/odłączone przy zmianie karty (co spowodowało zwiększenie użycia pamięci - powodem, dla którego lubię przełączać się na fragmenty)
należy użyć isDetached() tylko wtedy, gdy samodzielnie oddzieliłeś fragment. W przeciwnym razie powinieneś użyć metody isAdded() do obsługi przypadków, w których system zniszczył połączenie między Twoją aktywnością a fragmentem. – pcans
@Nikolay Elenkov, w jaki sposób cykl życia może uniknąć sprawdzania za każdym razem przed wywołaniem aktywności? – Bear