AsyncTask выполняется из Service (IntentService) и Activity — есть ли разница?

Есть ли разница между запуском AsyncSync из Activity или IntentService?

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

Для варианта с очередью я использую IntentService, поэтому платформа Android позаботится о том, чтобы поставить задачи в очередь за меня. Для их параллельной работы я использую AsyncTasks. Но я запускаю их из IntentService (может быть и Service) - есть ли в этом смысл? IntentService завершается сразу после выполнения AsyncTask, поэтому AsyncTask запускается без какого-либо «родителя».

Что, если я запустил эти AsyncTask из Activity, перешел на домашний экран, а система решила закрыть это Activity? Может ли это сделать? Выдержит ли AsyncTask это?

Какой подход был бы предпочтительнее в этом случае?


person bitrut    schedule 29.07.2011    source источник


Ответы (2)


AsyncTask на самом деле не подходит для вещей, когда вы беспокоитесь о выживании вне жизненного цикла компонента (если вам нужно отправить сообщение этому компоненту). Если вы собираетесь иметь службу, я бы даже не стал возиться с AsyncTasks. Что касается параллельности или очереди, это действительно зависит от множества различных переменных, но я, конечно, не стал бы делать ее полностью параллельной для любого количества загрузок/загрузок. Я бы установил ограничение на максимальное количество одновременных передач.

Нет смысла использовать IntentService для параллельного выполнения — вы уже заметили проблему с этим. Вы попадаете на территорию, которая на самом деле не охвачена Android API. AsyncTask и IntentService — это хорошие абстракции, которые упрощают несколько сценариев, но параллельное выполнение множества задач не входит в их число. Вероятно, лучше всего использовать некоторые классы многопоточности/конкурентности Java. Взгляните на ThreadPoolExecutor. .

person kabuko    schedule 29.07.2011
comment
Спасибо за ответ. Я выбрал опцию IntentService, и передачи были поставлены в очередь. Это кажется лучшей идеей в мобильной среде, где соединение не всегда такое стабильное, чем параллельная загрузка/выгрузка нескольких файлов. - person bitrut; 09.08.2011

Сначала ваши простые вопросы: AsyncTask будет работать в фоновом режиме, пока родительское приложение не будет уничтожено. Запуск его из действия сообщит системе, что его можно убить, если этого требует нехватка памяти. Система также не считает, что это длительный процесс, который может быть прерван.

В руководстве для разработчиков Сервисы есть отличное информационное поле под заголовком «Основы» о том, следует ли вам использовать службу или действие. Действия не получают никакого учета нехватки памяти, которую получают службы, или перезапуска после уничтожения, когда системные ресурсы снова становятся доступными.

Если вы хотите, чтобы я позвонил вам, используйте IntentService. Выполнять загрузку параллельно, последовательно или в какой-либо комбинации — сложный вопрос, потому что вы должны учитывать сеть (Wi-Fi или сотовая связь), размер файла и другие системные ресурсы.

person Dan S    schedule 29.07.2011