Вопрос по android-asynctask, android – Два разных AsyncTasks выполняются одновременно

4

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

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

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

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

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

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

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

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

Также эта проблема возникает в ICS, а не в Android 2.3, какэтот ответ предлагает.

Тем не менее, я нашел этот пост:stackoverflow.com/questions/4068984/…Я буду исследовать это. nhaarman
Вы можете опубликовать код? Christine
Оба должны выполнять сетевые операции, иAT1 не всегда выполняется, еслиAT2 выполнен. nhaarman
«AT1 ожидает в doInBackground, пока AT2 не выполнит свою задачу» - так нет смысла работать асинхронно .....? Mitch Wheat

Ваш Ответ

3   ответа
0

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

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

См редактировать в вопросе nhaarman
3

Когда я отправил этот вопрос,этот вопрос появился в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

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

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

Похожие вопросы