У меня есть две полные различные реализации AsyncTask
, скажем, AT1
и AT2
.
Сначала выполняется AT1
, затем выполняется AT2
. AT1
ждет в doInBackground
пока AT2
не выполнит свою задачу, опросив эти данные каждые 500 мс. Но этого никогда не бывает.
Так что я в основном хочу это:
Но, похоже, это так:
Кроме того, AT1
никогда не выполняется, и AT2
никогда не запускается.
Есть ли способ, которым я могу заставить эти две AsyncTask
s выполняться на двух отдельных потоках или есть другое решение для этого?
Невозможно сначала запустить AT2
и после этого выполнить AT1
.
РЕДАКТИРОВАТЬ
Для пояснения: AT1
выполняется, когда пользователь открывает конкретный экран и ему необходимо загрузить данные для этого экрана в зависимости от местоположения. AT2
выполняется при изменении местоположения, и когда это произойдет, некоторые вычисления сделаны, которые не могут быть выполнены в потоке пользовательского интерфейса.
Когда AT2
никогда не выполнялся, AT1
не имеет места для загрузки данных, поэтому ему нужно дождаться завершения AT2
. Когда AT2
был выполнен, данные о местоположении уже есть, и AT1
не нужно ждать.
Кроме того, эта проблема возникает в ICS, а не в Android 2.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); }
Какой смысл иметь две асинхронные задачи, если кто-то ждет другого? И если вы хотите это сделать, почему бы не начать первый второй и поставить «сделанные» вещи во вторую задачу?
Похоже, вам может потребоваться переосмыслить вашу логику – если вы начинаете поток, который затем должен ждать, пока другой поток выполнит какую-то работу, почему бы просто не работать с первым потоком?
Если вам действительно нужны 2 AsyncTasks, сначала собирайте все данные и не запускайте их до тех пор, пока первое не закончится – прочитайте о onPostExecute в документах.