2012-06-13 2 views
4

У меня есть две полные различные реализации AsyncTask, скажем AT1 и AT2.Выполняются две разные задачи AsyncTasks

AT1 выполнено в первую очередь, тогда выполняется AT2. AT1 ждет в doInBackground до AT2 выполнил свою задачу, опросив эти данные каждые 500 мс. Но этого никогда не бывает.

Так что я в основном хочу это: enter image description here

Но что, кажется, происходит это: enter image description here
Кроме AT1 никогда не делается, и AT2 никогда не начал.

Есть ли способ, которым я могу заставить эти два AsyncTask s быть выполненными на двух отдельных потоках, или есть другое решение для этого?

Невозможно сначала начать AT2 и после этого выполнить AT1.

EDIT
Для уточнения: AT1 выполняется, когда пользователь открывает определенный экран, и необходимо загрузить данные для этого экрана, на основе местоположения. AT2 выполняется при изменении местоположения, и когда это происходит, выполняются некоторые вычисления, которые не могут быть выполнены в потоке пользовательского интерфейса.

Когда AT2 еще не был выполнен, AT1 не имеет места для загрузки данных, поэтому для его завершения необходимо подождать AT2. Когда AT2выполнено, данные о местоположении уже есть, и AT1 не нужно ждать.

Кроме того, эта проблема возникает в ICS, а не в Android 2.3, например, this answer.

+0

«АТ1 ждет в doInBackground до АТ2 не выполнил свою задачу», - так что нет смысла в работает асинхронно .....? –

+0

Можете ли вы разместить код? – Christine

+0

Оба должны выполнять сетевые операции, а 'AT1' не всегда выполняется, если выполняется' AT2'. – nhaarman

ответ

3

Когда я разместил этот вопрос, this question появился в разделе Related. Это советы использовать executeOnExecutor, я реализовал это следующим образом:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    new SetLocationAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, location); 
} else { 
    new SetLocationAsyncTask().execute(location); 
} 
+0

Спасибо. Ты спас мой день :) –

0

Какой смысл иметь две асинхронные задачи, если кто-то ждет другого? И если вы хотите это сделать, почему бы не начать первый второй и поставить «сделанные» вещи во вторую задачу?

+0

Оба Asynctasks должны выполнять сетевые операции, поэтому необходимы Asynctasks. Кроме того, AT1 выполняется по запросу пользователя (открытый конкретный экран), AT2 выполняется при изменении местоположения. – nhaarman

+0

Я согласен с Барри, должен быть гораздо более простой способ сделать это, даже если вы используете две асинтесы. Я не стал бы зависеть от другого. Но мне нужно будет узнать больше об этом приложении, чтобы сказать больше. – Christine

0

Похоже, вам, возможно, понадобится переосмыслить свою логику - если вы начинаете поток, который затем должен ждать, пока другой поток выполнит какую-то работу, почему бы просто не запустить первый поток?

Если вам действительно нужны 2 AsyncTasks, попробуйте собрать все необходимые данные и не запускайте вторую до тех пор, пока первая не закончится - прочитайте о документах onPostExecute в документах.

+0

См. Редактирование в вопросе – nhaarman

Смежные вопросы