Должен ли я использовать AsyncTask или IntentService для моего приложения?
Я читал об интернет-соединении с Android и заметил, что есть разные способы справиться с этим, например AsyncTask
и IntentService
. Тем не менее, я все еще не уверен, какой из них использовать. Мое приложение - это в основном поиск местоположения/следов в Google Maps. Мое подключение к Интернету будет использоваться для поиска ближайших маршрутов в пределах определенного радиуса карты. Таким образом, каждый раз, когда пользователь перемещает или перемещает карту в новое место, он будет обновляться с ближайшими следами. Это также добавит новый след и позволит пользователю оценить след.
Хватит ли AsyncTask
для этого или я должен использовать IntentService
?
Ответы
Ответ 1
Вы должны использовать AsyncTask
для коротких повторяющихся задач, которые тесно связаны с действием, например, с тем, что вы в настоящее время пытаетесь сделать. IntentService
больше ориентированы на запланированные задачи (повторяющиеся или нет), которые должны работать на фоне, независимо от вашей активности.
Ответ 2
Их можно использовать очень по-разному для разных целей.
AsyncTask
- удобная программа для потоковой передачи, которая может использоваться, если вам нужно постоянно сообщать пользователю что-то или периодически выполнять операции над основным потоком. Он предлагает много мелкозернистого управления, и из-за этого с природой очень легко работать в Activity
, тогда как IntentService
обычно требует использования рамки BroadcastReceiver
или IBinder
.
IntentService
можно использовать очень похоже на AsyncTask
, но его цель предназначена для загрузки, выгрузки или других операций блокировки, которые не требуют взаимодействия с пользователем или основного потока. Например, если вы хотите загружать и кэшировать карты, вы можете вызвать IntentService
, чтобы пользователю не нужно было искать приложение для его загрузки. Аналогично, если вы отправляете данные на свой сервер, IntentService
чрезвычайно полезен в этом отношении, потому что вы можете начать и забыть. Пользователь может, скажем, ввести комментарий в своем приложении, а затем нажать "отправить". "Отправить" запустит IntentService
, который получит комментарий и отправит его на ваш сервер в фоновом потоке. Пользователь может нажать "отправить" и сразу оставить приложение, и комментарий, в конечном счете, по-прежнему достигнет ваших серверов (при условии, конечно, ошибок). Если вы сделали это с AsyncTask
в своем Activity
, с другой стороны, система могла бы убить ваш процесс посередине вашего обмена, и он может или не может пройти.
Вообще говоря, ни один из них не предназначен для приложений с длительным сроком службы. Они предназначены для коротких одноразовых операций. Они могут использоваться для постоянных или длительных действий, но не рекомендуется.
Ответ 3
AsyncTask не очень хорошо работает с изменениями конфигурации или другими вещами, которые перезапускают Activity.
IntentService хорош для того, что всегда должно быть доступно, независимо от того, сколько времени требуется для выполнения его работы. Я предпочитаю IntentService в большинстве случаев, потому что AsyncTask намного больше зависит от состояния Activity.
Некоторые примечания:
- AsyncTask лучше всего подходит для быстрых задач, которые должны вернуться к пользовательскому интерфейсу, но его можно использовать в самых разных ситуациях.
- Заявление "периодически выполнять операции над основным потоком" является неопределенным. AsyncTask генерирует новый фоновый поток, отличный от основного потока, и выполняет свою работу над новым потоком. Таким образом, имя AsyncTask.
- IntentService не требует "манипулирования" инфраструктурой BroadcastReceiver. Все, что вам нужно сделать, - отправить местное трансляционное намерение и обнаружить его в своей деятельности. Это сложнее сделать, чем AsyncTask, я не знаю.
- IntentService предназначен для выполнения длительных задач, которые он выполняет в фоновом режиме.
- AsyncTaskLoader в порядке, но он должен быть базовым классом для CursorLoader и т.д.
Если вы хотите обновить "близлежащие" трейлы, когда пользователи переместятся в новое место, IntentService, вероятно, лучше.
Не забудьте проверить подключение, прежде чем пытаться обновить местоположение.
Ответ 4
AsyncTasks очень тесно привязаны к Activity и часто могут вызывать утечку оконных ошибок, если вы переходите от Activity, создавшего AsyncTask. Но они отлично подходят для показа ProgressBar, потому что вы можете быстро обновить процент прогресса.
IntentServices чище и безопаснее. Их сложнее реализовать, когда вы начинающий разработчик Android, но как только вы узнаете, как их запускать и обрабатывать, вы, вероятно, никогда не вернетесь в AsyncTasks!
IntentServices также позволяет использовать более модульную конструкцию в вашем приложении. Обычно я создаю отдельный класс для всех своих IntentServices, но для AsyncTasks я создаю их как внутренний класс Activity. Если бы я выделил AsyncTask из Activity, мне пришлось бы передавать объекты Activity Context и View в конструкторе AsyncTask, которые могут быть беспорядочными.
Ответ 5
Как уже упоминалось выше, AsyncTask
решит вашу проблему.
Но имейте в виду, что AsyncTask
имеет важную слабость: он плохо справляется Activity
"обновить" (например, во время вращения). Это может быть проблемой, если, например, пользователь поворачивает телефон, пока ваш AsyncTask
по-прежнему загружает файлы. Если это действительно проблема для вас, я рекомендую AsyncTaskLoader
:
http://developer.android.com/reference/android/content/AsyncTaskLoader.html
Ответ 6
AsyncTask
и IntentService
имеют много одинаковых
- Может выполнить задачу в рабочем потоке
- Может работать в фоновом режиме
- Продолжайте работать до тех пор, пока задача не завершится, если действие, которое ее начало, уничтожено
- Может уведомлять об обновлении пользовательского интерфейса во время выполнения задачи или после завершения задачи
- Для
AsyncTask
мы часто используем onProgressUpdate
, onPostExecute
или если вы хотите, вы можете использовать BroadcastReceiver
- Для
IntentService
мы используем BroadcastReceiver
Разные
1) Отправить задачу во время работы или после окончания работы
Пример, перед которым стоит наша задача: скачать файл с базы сервера по fileName
.
Использование AsyncTask
Если мы являемся одним экземпляром AsyncTask
, во время выполнения загрузки файла A мы не можем выполнить загрузочный файл B AsyncTask
(так как мы получаем java.lang.IllegalStateException: Cannot execute task: the task is already running.
). Также после завершения загрузки файла A мы не можем выполнить загрузку файла B (поскольку мы получаем java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
.
Чтобы загрузить файл B во время или после загрузки файла A, нам нужно создать новый экземпляр AsyncTask
.
=> Чтобы скачать файл A и файл B, нам нужно 2 экземпляра AsyncTask
=> создано 2 рабочих потока
Использование IntentService
Во время загрузки файла A мы можем отправить намерение загрузить файл B => после того, как загрузка файла A завершится, он автоматически начнет загрузку файла B => не требует нового экземпляра, не нужен новый рабочий поток.
Если мы отправили намерение загрузить файл B после завершения загрузки файла A? После завершения загрузки файла A IntentSevice будет уничтожен (поскольку больше нет задачи). Поэтому, когда начинается загрузка файла B, создается новый экземпляр Service
однако новый поток не создается (служба продолжает использовать только 1 рабочий поток, имя которого определено в конструкторе IntentSevice
2) Внедрить AsyncTask
проще, чем IntentService
С ПОМОЩЬЮ
Мы увидим, что AsyncTask
и IntentService
имеют много одинаковых, поэтому в большинстве случаев мы можем использовать AsyncTask
или IntentService
. тем не мение
- Я часто использую
AsyncTask
для некоторых задач, которые начинаются, заканчиваются, взаимодействуют с пользовательским интерфейсом в 1 Activity
- Я часто использую
IntentService
для какой-либо задачи, которая может начинаться/заканчиваться и взаимодействовать или не взаимодействовать с пользовательским интерфейсом из любого Activity
Этот ответ основан на моем тесте. Пожалуйста, поправьте меня, если я ошибаюсь. Надеюсь, это поможет.
Ответ 7
Короче говоря, AsyncTask предназначен для коротких задач, которые должны взаимодействовать с основным потоком. IntentService предназначен для длительных задач, которые не должны связываться с основным потоком.
Для получения дополнительной информации, проверьте эти ссылки
http://www.onsandroid.com/2011/12/difference-between-android.html
https://medium.com/@skidanolegs/asynctask-vs-intentservice-1-example-without-code-5250bea6bdae
https://android.jlelse.eu/using-intentservice-vs-asynctask-in-android-2fec1b853ff4
Ответ 8
Я согласен с @DeeV и @ebarrenechea об услуге Intent в части, которую вы должны использовать для задачи, которая не связана с Activity, например, загружая некоторые данные на сервер или сохраняя данные с сервера на базу данных.
Но начиная с Android 3.0 были введены API загрузчиков, которые должны заменить AsyncTask. Так, например, для загрузки списка, который вы должны отображать в Activity, лучше использовать Loader, который предназначен для наилучшего управления всеми изменениями конфигурации и жизненным циклом активности.
Учебник по загрузке Vogella