Создание очереди загрузки - PullRequest
       21

Создание очереди загрузки

5 голосов
/ 05 февраля 2011

Так что мне нужно загрузить несколько изображений на веб-сервер. У меня есть метод загрузки создан. Теперь мне нужен способ создать очередь загрузки, чтобы я мог управлять загрузками и отменять их. Каков наилучший способ сделать что-то подобное? Я определенно буду управлять сервисом для этого. Я просматривал класс IntentService, и мне кажется, что это хороший способ сделать очередь (поскольку мне просто нужно загружать по 1 файлу за раз), но моя загрузка будет состоять из 3 частей - первой части, в которую я звоню серверу получить авторизацию, второй будет фактическая загрузка, а третий отправит подтверждение того, что файл был успешно отправлен.

Хорошо, вот и сделка. Как отменить конкретную загрузку в очереди? Как мне отложить уничтожение службы, если процесс находится в третьей части загрузки (размещение информации об успешной загрузке в веб-сервисе)?

Ответы [ 2 ]

3 голосов
/ 05 февраля 2011

Как отменить определенную загрузку в очереди?

С IntentService нет. Вам нужно написать свой собственный Service, который ведет себя как IntentService (фоновый поток, рабочая очередь, stopSelf(), когда очередь пуста), но где вы можете лучше управлять очередью.

Как отложить уничтожение службы, если процесс находится в третьей части загрузки

Если вы используете IntentService или ваш собственный IntentService -подобный, сервис обычно не будет уничтожен, пока не будет больше никакой работы.

Если вы обеспокоены тем, что Android закрывает ваш сервис, поскольку он считает, что вы слишком долго находитесь в памяти, используйте startForeground().

0 голосов
/ 13 августа 2012

Начиная с API 11 и выше, хорошим подходом является использование FixedThreadPool с асинхронными задачами. Сделать один раз:

ExecutorService threadPoolExecutor = Executors.newFixedThreadPool(3);

Где 3 - количество загрузок, которые вы хотите запустить одновременно. Он поставит задачу в очередь, если уже запущено 3 загрузки, и автоматически выполнит задачу позже. Запустите асинхронные задачи с помощью:

yourAsynTask.executeOnExecutor(threadPoolExecutor, params);

Возможно, Params - это URL, к которому вы хотите подключиться. Вы можете прочитать его в onPostExecute вашей асинхронной задачи и подключиться к серверу, используя HttpURLConnection .

Убедитесь, что вы вызвали это при выключении:

threadPoolExecutor.shutdown()
...