Почему AsyncTask запускается в главном потоке приложения? - PullRequest
13 голосов
/ 07 февраля 2011

в моем приложении у меня есть класс для пользовательского интерфейса, имя которого «SettingActivity».

Затем для выполнения некоторых заданий в фоновом режиме я связываю этот класс пользовательского интерфейса (SettingActivity) со службой.В этой службе есть два предопределенных метода (определенных в файле .aidl), один - startTask (), другой - stopTask ().

В startTask () я сделал вызов AsyncTask.Но когда я проверил имя Looper этой AsyncTask.Это «главное».По моему мнению, AsyncTask должен запускать другой поток, отличный от основного потока .

Так кто-нибудь знает, почему это происходит?

Коды следующие: </p> <pre>@Override protected void onPreExecute() { super.onPreExecute(); Log.d(TAG, "onPreExecute "+Looper.myLooper().getThread().getName()); }

Тогда я получу main в качестве вывода.

Ответы [ 2 ]

27 голосов
/ 07 февраля 2011

AsyncTask имеет несколько частей, которые вы можете переопределить: метод doInBackground, который фактически выполняется в отдельном потоке, и три метода - onPreExecute, onProgressUpdate и onPostExecute - в потоке пользовательского интерфейса. (Реализация этих методов по умолчанию ничего не делает, и onProgressUpdate запускается только при вызове publishProgress, обычно из doInBackground.) Цель onPostExecute - опубликовать результаты (например, обновить иерархию представлений или установить текст в текстовом представлении), что должно быть сделано в потоке пользовательского интерфейса. Он также может публиковать обновления прогресса. Чтобы все это работало правильно, необходимо создать AsyncTask и вызвать метод execute в потоке пользовательского интерфейса.

Вы не должны вызывать действия пользовательского интерфейса из doInBackground - это может привести к сбою приложения.

9 голосов
/ 08 февраля 2011

На самом деле, я проверил документ Android, onPreExecute (), onProgressUpdate (Progress ...) и onPostExecute (Result) все "вызывается в потоке пользовательского интерфейса".

Только метод doInBackground (Params ...) вызывается в фоновом потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...