Pracuję teraz z dość powszechną sytuacją - pobierz niektóre dane przez Internet, a następnie zaktualizuj widok, aby go wyświetlić. Oczywiście chcę zrobić pobieranie w tle, a następnie zaktualizować widok w głównym wątku UI. Teraz patrząc na mój kod, trochę martwię się o moją Aktywność i jej elementy interfejsu użytkownika, zanim zostaną zaktualizowane. Oto esencja tego, co mam na myśli:Jak mogę sprawdzić, czy mój kontekst jest nadal ważny?
Thread update = new Thread() {
public void run() {
final Data newData = requestData();
if (newData != null) {
post(new Runnable() {
public void run() {
Toast.makeText(MyClass.this, "I'll do things here that depend on my context and views being valid", Toast.LENGTH_SHORT).show();
}
});
}
}
};
update.start();
Wydaje się możliwe, że podczas pobierania danych działanie może zostać zniszczone. Co się wtedy stanie? Czy moja wątek będzie nadal wykonywany? Czy w końcu spróbuję uzyskać dostęp do martwych obiektów?
Zwykle robię to przez AsycTask, ale praca wydawała się dość prosta, tym razem po prostu wstawiać wątki - wątki uruchamiające. Czy poprawię sytuację, używając zamiast tego AsyncTask?
To prawdopodobnie nie będzie kompilacji, musisz albo uczynić ją statyczną, albo musisz dodać MyActivity.this. – EboMike
Przeważnie skopiowałem kod z pytania tylko po to, aby podać ogólny pomysł, nie zamierzałem, aby kod w odpowiedzi był używany w rzeczywistych aplikacjach. Zaktualizowałem kod, teraz się on skompiluje (choć to nie jest naprawdę ważne). – Malcolm
Mam zamiar wypróbować ten boolean na teraz, więc daję temu jeden znacznik wyboru. Mimo to, dziękuję za odpowiedzi, Kurtis i EboMike. Nie słyszałem nawet o ładowarkach, dopóki o nich nie wspomniałeś. – MaximumGoat