2011-02-07 13 views
12

w mojej aplikacji, mam klasę dla rzeczy interfejsu użytkownika, którego nazwa to "SettingActivity".Dlaczego AsyncTask działa w głównym wątku aplikacji?

Następnie dla wykonywania niektórych zadań w tle, wiążę tę klasę UI (SettingActivity) z Usługą. Istnieją dwie predefiniowane metody w tej usłudze (zdefiniowane w pliku .aidl), jedna to startTask(), druga to stopTask().

W funkcji startTask() wykonałem wywołanie funkcji AsyncTask. Ale kiedy sprawdziłem nazwę Looper tego AsyncTask. Jest "główny". Moim zdaniem, AsyncTask powinien rozpocząć inny wątek inny niż główny wątek.

Czy ktoś wie, dlaczego tak się dzieje?

Kody są następujące:

@Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     Log.d(TAG, "onPreExecute "+Looper.myLooper().getThread().getName()); 
    } 

Then I will get main as the output.

+1

Byłoby pomocne, gdyby można było opublikować przykładowy kod. –

Odpowiedz

23

An AsyncTask has several parts: a doInBackground Metoda, która w rzeczywistości działa w oddzielnym wątku, oraz metoda onPostExecute działająca w wątku interfejsu użytkownika. Celem onPostExecute jest opublikowanie wyników (takich jak aktualizacja hierarchii widoków lub ustawienie tekstu w widoku tekstowym), które należy wykonać w wątku interfejsu użytkownika. Może również publikować aktualizacje postępu. Aby to wszystko działało poprawnie, należy utworzyć AsyncTask i wywołać metodę execute w wątku interfejsu użytkownika.

Nie można wywoływać działań interfejsu użytkownika z poziomu doInBackground - spowoduje to awarię aplikacji.

+0

Dziękuję za odpowiedź. Naprawdę bardzo mi pomogłem ~ – Mathieu

+0

Na przykład, jeśli chcę zrobić Toast w oddzielnym wątku, co powinienem zrobić? – Behzad

+1

@Behzad - Jeśli masz odwołanie do działania, możesz użyć 'runOnUiThread' zgodnie z opisem w [tej odpowiedzi] (http://stackoverflow.com/a/3134720/535871). –

6

W rzeczywistości, mam sprawdzone doc Androida, onPreExecute(), onProgressUpdate (Progress ...) i onPostExecute (Wynik) są "wywoływane na wątków UI".

Tylko metoda doInBackground (Params ...) jest "wywoływana w wątku tła".

Powiązane problemy