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

Ответ 1

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

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

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

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

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

Подробнее см. раздел "Порядок выполнения" AsyncTask JavaDocs.

Ответ 2

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

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

Ответ 3

UPDATE: скопировано из Android-разработчики и инициировано 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);