2012-05-21 15 views
10

Należy rozważyć wywołanie funkcji AsyncTask w działaniu. Co się stanie, jeśli działanie zostanie przerwane lub zniszczone? Czy uruchomiona zostanie funkcja onPostExecute()? Jeśli tak, jaki wątek będzie używany?Co naprawdę oznacza "działa na wątku UI" dla onPostExecute()?

Po prostu zastanawiam się.

Wielkie dzięki z góry.

+0

'onPostExcecute' będzie działać, ale wyrzuci wyjątek, próbując uruchomić martwego wątku, jeśli twoja aktywność zostanie zniszczona. Jeśli masz uruchomioną funkcję AsyncTask, gdy twoja aktywność może być wyłączona, rozważ przeniesienie kodu do usługi lub za pomocą programu ładującego. – Jave

+0

w przypadku Aktywność zniszczona: Zostanie rozbita, ponieważ utracono odniesienie z Aktywnością początkową. Incase Activity pauza, nadal działa na tej Aktywności. W tym scenariuszu: powinieneś używać usługi intencji i uzyskiwać wyniki za pośrednictwem rozgłaszania. –

Odpowiedz

10

Wątek interfejsu użytkownika jest dostępny przez cały okres widoczności aplikacji, która może obejmować kombinację wielu czynności.

coś zmienić w widokach należy wykonać na wątku UI i onPostExecute z AsyncTask odzwierciedla tę samą logikę, wykonując instrukcje wewnątrz na wątku UI.

Możesz użyć runOnUiThread we własnym Thread, aby wprowadzić zmiany w widokach. Ale od AsyncTask ma onPostExecute metoda (która działa również na wątku UI), więc nie logicznie trzeba użyć runOnUiThread tam.


Aktualizacja

chodzi o Twoje pytanie: Tak, onPostExecute nadal będzie się nazywać (ponieważ jego wywoływane przez osobny wątek), nawet jeśli działalność jest zniszczona, a jeśli metoda będzie manipulować Widoki, po prostu otrzymasz komunikat o błędzie Force Close, ponieważ odwołanie do Twojej aktywności nie jest już dostępne.

+2

jego pytanie jest inne, proszę przeczytać ponownie – Akram

0

Pamiętaj, aby wywołać funkcję anulowania, która będzie wyjątkowa w Twoim przypadkuPause lub onDestroyed.

+0

Dziękuję za odpowiedź. Odpowiedzi Wagów wraz z Twoją wskazówką pozwolą mi jeszcze bardziej ulepszyć obecny projekt. –

1

To spowoduje awarię w onPostExecute() z powodu wątku UI, podobnie jak okno dialogowe procesu. Zdarza mi się, moja Aktywność niszczy zanim mój Asynctask się zakończy. Mówi "okno wyciekło ....." Tak więc usuwam onPostExecute(). Koniec awarii ..