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



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



будет AsyncTask достаточно для этого, или я должен использовать IntentService?

606   7  

7 ответов:

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

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

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

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

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

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

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

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

  • AsyncTask is лучшие для быстрых задач, которые должны вернуться обратно в пользовательский интерфейс, но он может используйте в различных ситуациях.
  • утверждение "периодически выполнять операции над основным потоком" является расплывчатым. AsyncTask порождает новый фоновый поток, который составляет отличается от основной поток, и делает свою работу на новую тему. Таким образом, имя AsyncTask.
  • IntentService не требует "манипулирования" структурой BroadcastReceiver. Все, что вам нужно сделать, это отправить локальное широковещательное намерение и обнаружить его в своей деятельности. Будет ли это сложнее сделать чем-то вроде асинхронной задачи, я не знаю.
  • IntentService и предназначен для выполнения длительных задач, которые он делает в фоновом режиме.
  • AsyncTaskLoader можно использовать, но он должен быть базовым классом для CursorLoader и т. д. Если вы хотите обновить" близлежащие " маршруты, когда пользователи перемещаются в новое место, IntentService, вероятно, лучше.

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

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

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

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

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

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

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

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 после скачать файл готовый? После загрузки файла готовое, IntentSevice будет уничтожен (потому что нет больше задач). Поэтому при запуске загрузки файла B, новый экземпляр Service создается, однако новый поток не создается (служба продолжает использовать только 1 рабочий поток, имя которого определено в IntentSevice конструктор

2) реализовать AsyncTask легче IntentService

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

  • я часто использую AsyncTask для некоторых задач, которые начинаются, заканчиваются, взаимодействуют с пользовательским интерфейсом в 1 Activity
  • я часто использую IntentService для некоторых задач, которые могут старт/финиш и взаимодействовать или не взаимодействовать с UI из любого Activity

этот ответ основан на моем тесте. Пожалуйста, поправьте меня, если я ошибаюсь. Надеюсь, это поможет.

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

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

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

Comments

    Ничего не найдено.