Подтвердить что ты не робот

Как эффективно управлять несколькими задачами Async в Android

У меня есть сценарий, где мне нужно будет сделать шесть http-вызовов на моем сервере, чтобы получить данные для шести разных элементов. Эти серверные вызовы не могут быть объединены, и они должны быть такими. Например: если вам нужна информация котировки для GOOGLE, отправьте запрос на сервер, запрашивающий информацию о котировке google. Затем, если вам нужна yahoo, тогда вы инициируете другой HTTP-вызов и так далее.

Вот ситуация:

  • Теперь мой конечный пользователь хочет сравнить 6 разных компаний.
  • Как я уже говорил, для меня не удалось сделать 6 http-звонков, для которых я использую 6 Async Tasks.
  • По мере того как я получаю каждый из ответов задачи Async, я обновляю пользовательский интерфейс новыми данными.
  • Плохой пользовательский интерфейс, если я обновляю UI 6 раз за очень короткий промежуток времени.
  • Он дает мерцающий эффект для моего пользовательского интерфейса, который нежелателен.

Мой вопрос:

  • Как я могу удержаться от обновления пользовательского интерфейса, пока не получу все ответы на 6 ответов Async?
  • Я понимаю, что каждая задача не зависит друг от друга. Должен ли я запускать цикл while и ждать, пока не получу все ответы?
  • Есть ли лучший способ сделать это, а не цикл while, потому что, если какой-либо из вызовов не отвечает, я буду ждать всегда.

Примечание. Я предполагаю, что Android 1.6+ выполняет параллельные задачи Async.

Это больше вопрос дизайна, и я был бы признателен за любую помощь в этом.

Заранее спасибо

4b9b3361

Ответ 1

Я нашел это решение более подходящим для моей проблемы. Эта ссылка описывает несколько способов установления этого. 1. Исполнитель 2. ExecutoreService и CountDownLatch

ExecutoreService и CountDownLatch

Ответ 2

Вы можете создать объект пула AsyncTask, который позволяет обманывать "пакетный" http-вызов.

  • создайте коллекцию AsyncTasks Observable, я буду ссылаться на эту коллекцию как ваш пул
  • ваша активность создает AsyncTasks (но еще не выполняется) и добавляет их в пул
  • Активность регистрируется как наблюдатель пула
  • Активность указывает пулу выполнить, пул в свою очередь вызывает выполнение в каждой из своих задач
  • Когда задачи завершаются (как для успеха, так и для отказа), они сохраняют данные ответа в пуле, а пул помещает задачу как "завершенную"
  • После того, как все задачи будут отмечены как завершенные, пул уведомляет об активности прослушивания

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

Вам нужно будет разобраться, как AsyncTasks сообщает Пулу, что они закончены. Возможно, просто реализована реализация AsyncTask, которая берет пул на его конструкторе, чтобы задачи имели ссылку на пул.

Ответ 3

Существует много способов справиться с этим:

  • Другой AsyncTask, который объединяет ответы из сетевых задач.
  • Выполните sendEmptyMessageDelayed() каждый, скажем, 500 мс, в Handler, созданный вашим Activity, который обновляет данные, входящие в сетевые задачи, и продолжает делать это до тех пор, пока все сетевые результаты не будут рассмотрены.
  • Поток, который выполняет агрегацию.

Если бы это я, я бы, вероятно, пошел с Handler. Подводя итоги, ваши сетевые задачи хранят данные в промежуточном хранилище. Отправлять отложенные сообщения обработчику и в пределах handleMessage() проверять данные в промежуточном хранилище и публиковать обновленные результаты. Если результаты не выданы, отправьте сообщение с задержкой еще раз.

Ответ 4

просто колоть в темноте здесь, но у вас есть:

  • 1x основной поток пользовательского интерфейса.
  • 6x фоновые asynchtasks, которые имеют: 6x методов для выполнения в фоновом режиме 6x методы для возврата данных в пользовательский интерфейс (переднем плане).

почему бы не иметь переменную public scope в потоке пользовательского интерфейса, называемую " finishedTasks", то тот же самый метод в каждом из 6x потоков данных возврата, который:

  • increments finishedTasks

  • if finishedTasks == 6 затем запустите 1 общедоступный метод для обновления пользовательского интерфейса

то он обновит пользовательский интерфейс во всех завершающих фоновых asychtasks.