Должен ли я использовать 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