Подтвердить что ты не робот

Почему AsyncTask запускается в основном потоке приложения?

в моем приложении, у меня есть класс для материала UI, имя которого - "SettingActivity".

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

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

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

Коды выглядят следующим образом:

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

Затем я получу основной результат.

4b9b3361

Ответ 1

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

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

Ответ 2

Фактически, я проверил документ андроида, onPreExecute(), onProgressUpdate (Прогресс...) и onPostExecute (Результат) все "вызывается в потоке пользовательского интерфейса".

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