Intereting Posts
Как увидеть предупреждения Gradle на Android Studio? Как перенести существующее приложение SQLite в библиотеку пространственного сопротивления? Внутренний класс может получить доступ, но не обновлять значения – AsyncTask Android-анимационный файл студии Android Studio: сбой поддержки синхронизации с поддержкой -v4-24.1.1.jar Android Facebook LoginButton Callback отменяет отмену Каков правильный способ проверки доступности мобильной сети (без подключения к данным) Включить предварительно скомпилированную статическую библиотеку с использованием NDK Как сделать эффект свечения вокруг растрового изображения? Добавить элемент в arraylist, если он еще не существует в списке Возможно ли переход от общего элемента в представление в RecyclerView? Минимальные размеры макетов Android Ошибка MediaPlayer -38,0 Доступ к каталогу / cache в файловой системе Android Как получить ориентацию телефона Android, соответствующую человеческой ориентации?

Должен ли я использовать AsyncTask или IntentService для моего приложения?

Я читал об интернет-соединении с Android и заметил, что есть разные способы справиться с этим: AsyncTask и IntentService. Тем не менее, я все еще не уверен, какой из них использовать. Мое приложение в основном является поиском местоположения / маршрутов с Google Maps. Мое подключение к Интернету будет использоваться для поиска ближайших маршрутов в пределах определенного радиуса карты. Таким образом, каждый раз, когда пользователь перемещает или просматривает карту в новое место, он обновляется с ближайшими тропами. Он также добавит новый маршрут и позволит пользователю оценивать маршрут.

Будет ли AsyncTask достаточным для этого или следует использовать IntentService?

Solutions Collecting From Web of "Должен ли я использовать AsyncTask или IntentService для моего приложения?"

Вы должны использовать AsyncTask для выполнения коротких повторяющихся задач, которые тесно связаны с действием, например, с тем, что вы в настоящее время пытаетесь сделать. IntentService больше ориентированы на запланированные задачи (повторяющиеся или нет), которые должны выполняться на фоне, независимо от вашей активности.

Их можно использовать очень по-разному для разных целей.

AsyncTask – удобная программа для потоковой AsyncTask которая может использоваться, если вам нужно постоянно сообщать пользователю что-то или периодически выполнять операции над основным потоком. Он предлагает много мелкозернистого контроля, и из-за его природы очень легко работать в Activity тогда как IntentService обычно требует использования IBinder BroadcastReceiver или IBinder .

IntentService можно использовать очень похоже на AsyncTask , но его цель предназначена для загрузки, выгрузки или других операций блокировки, которые не требуют взаимодействия с пользователем или основного потока. Например, если вы хотите загружать и кэшировать карты, вы можете позвонить в IntentService чтобы пользователю не нужно было искать приложение для его загрузки. Аналогично, если вы отправляете данные на свой сервер, IntentService чрезвычайно полезен в этом отношении, потому что вы можете начать и забыть. Пользователь может, скажем, ввести комментарий в вашем приложении, а затем нажать «отправить». «Отправить» запустит IntentService который получит комментарий и отправит его на ваш сервер в фоновом потоке. Пользователь может нажать «отправить» и немедленно покинуть приложение, и комментарий, в конечном счете, по-прежнему достигнет ваших серверов (при условии, конечно, ошибок). Если вы сделали это с помощью AsyncTask в своей Activity с другой стороны, система может убить ваш процесс в середине вашего обмена, и он может или не может пройти.

Вообще говоря, ни один из них не предназначен для приложений с длительным сроком службы. Они предназначены для коротких одноразовых операций. Они могут использоваться для постоянных или длительных действий, но это не рекомендуется.

AsyncTask не очень хорошо работает с изменениями конфигурации или другими вещами, которые перезапускают Activity.

IntentService хорош для того, что всегда должно быть доступно, независимо от того, сколько времени требуется для выполнения его работы. Я предпочитаю IntentService в большинстве случаев, потому что AsyncTask намного больше зависит от состояния Activity.

Некоторые примечания:

  • AsyncTask лучше всего подходит для быстрых задач, которые должны вернуться к пользовательскому интерфейсу, но его можно использовать в самых разных ситуациях.
  • Заявление «периодически выполнять операции над основным потоком» является неопределенным. AsyncTask генерирует новый фоновый поток, отличный от основного потока, и выполняет свою работу над новым потоком. Таким образом, имя AsyncTask.
  • IntentService не требует «манипулирования» базой BroadcastReceiver. Все, что вам нужно сделать, – отправить местный транслятор Intent и обнаружить его в своей деятельности. Это сложнее сделать, чем AsyncTask, я не знаю.
  • IntentService предназначен для выполнения длительных задач, которые он выполняет в фоновом режиме.
  • AsyncTaskLoader в порядке, но он предназначен для базового класса для CursorLoader и т. Д. Если вы хотите обновить «близлежащие» маршруты, когда пользователи переместятся в новое место, IntentService, вероятно, лучше.

Не забудьте проверить подключение, прежде чем пытаться обновить местоположение.

AsyncTasks очень жестко привязаны к Activity и часто могут вызывать утечку оконных ошибок, если вы перемещаетесь от Activity, создавшего AsyncTask. Но они отлично подходят для показа ProgressBar, потому что вы можете быстро обновить процент прогресса.

IntentServices чище и безопаснее. Их сложнее реализовать, когда вы начинающий разработчик Android, но как только вы узнаете, как их запускать и обрабатывать, вы, вероятно, никогда не вернетесь в AsyncTasks!

IntentServices также допускает более модульный дизайн в вашем приложении. Обычно я создаю отдельный класс для всех своих IntentServices, но для AsyncTasks я создаю их как внутренний класс Activity. Если бы я выделил AsyncTask из Activity, мне пришлось бы передавать объекты Activity Context и View в конструкторе AsyncTask, которые могут быть беспорядочными.

Как упоминалось выше, AsyncTask решит вашу проблему.

Но имейте в виду, что AsyncTask имеет важную слабость: он плохо обрабатывает Activity «Обновить» (например, во время вращения). Это может быть проблемой, если, например, пользователь поворачивает телефон, пока ваша AsyncTask все еще загружает AsyncTask . Если это действительно проблема для вас, я рекомендую AsyncTaskLoader :

http://developer.android.com/reference/android/content/AsyncTaskLoader.html

Я согласен с @DeeV и @ebarrenechea о службе Intent в части, что вы должны использовать ее для задачи, которая не связана с активностью, например, загружать некоторые данные на сервер или хранить данные с сервера на базу данных.

Но начиная с Android 3.0 появился API Loaders API, который должен заменить AsyncTask. Так, например, для загрузки списка, который вы должны отображать в Activity, лучше использовать Loader, который предназначен для обработки всех изменений конфигурации и жизненного цикла Activity.

Учебник по загрузке Vogella