AsyncTask выполняется из Service (IntentService) и Activity - есть ли разница? - PullRequest
3 голосов
/ 29 июля 2011

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

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

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

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

Какой подход предпочтителен для этого случая?

Ответы [ 2 ]

1 голос
/ 29 июля 2011

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

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

0 голосов
/ 29 июля 2011

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

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

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

...