Android две AsyncTasks последовательно или параллельно? - Второй зависает, но результат в порядке

Я запускаю две задачи AsyncTask в своем приложении для Android, которые относятся к одному классу, но с разными параметрами. Например:

new myAsynckTask(a,b,c).execute();
new myAssyncTask(a,d,e).execute();

Они выполняются параллельно или последовательно? Я спрашиваю об этом, потому что, когда первый запускается, показывает ход выполнения, а когда он заканчивается, я вижу второй, которому нужно больше времени для завершения, но я не вижу прогресса (я вижу прямоугольник, но индикатор выполнения не показывает 20%.. и так далее). Это как замораживание, но результат в порядке.

Что я хочу сделать, так это запустить их в последовательном порядке и иметь возможность видеть прогресс в двух из них. Я запускаю приложение на Android Jelly Bean 4.2.2 API Level 17.


person George Melidis    schedule 06.09.2013    source источник


Ответы (3)


Они выполняются параллельно или последовательно?

Если ваш android:targetSdkVersion 13 или выше, и вы работаете на устройстве Android 3.2 или выше, они будут выполняться последовательно.

Если вы работаете на Android 1.5, они будут выполняться последовательно.

В противном случае они будут выполняться параллельно.

Вы можете выбрать параллельное выполнение, заменив execute() на executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR).

Дополнительную информацию см. в разделе «Порядок выполнения» AsyncTask JavaDocs.

person CommonsWare    schedule 06.09.2013

Ответ на ваш вопрос: это полностью зависит от того, на какой версии Android вы используете это, и это огромная проблема, с которой я столкнулся в нескольких приложениях.

Вы должны проверить эту ссылку, если хотите увидеть, как их правильно запускать

person Cruceo    schedule 06.09.2013

ОБНОВЛЕНИЕ: скопировано с сайта Android Developers и инициировано Yazazzello.

«Этот класс устарел на уровне API 26.0.0-alpha1. Используйте AsyncTask напрямую».

Вы должны использовать это для параллельного выполнения:

AsyncTaskCompat.executeParallel(new AsyncTask<Param, Void, Data>() {
                @Override
                protected Data doInBackground(Param... params) {
                    return downloader.getData(params[0]);
                }

                @Override
                protected void onPostExecute(Data response) {
                    processData(response);
                }
}, param);
person luckyhandler    schedule 23.11.2016
comment
«AsyncTaskCompat» Этот класс устарел на уровне API 26.0.0-alpha1. Используйте AsyncTask напрямую. - person Yazazzello; 20.06.2017