Должен ли я использовать AsyncTask или IntentService для моего приложения?
Я читал о подключении к интернету с Android и заметил, что есть разные способы справиться с этим, т. е. AsyncTask и IntentService. Однако я все еще не уверен, какой из них использовать. Мое приложение-это в основном поиск местоположения/трасс с картами Google. Мое подключение к интернету будет использоваться для поиска ближайших маршрутов в пределах определенного радиуса на карте. Таким образом, каждый раз, когда пользователь перемещает или прокручивает карту в новое место, она будет обновляться с помощью ближайшие тропы. Он также добавит новый след и позволит пользователю оценить след.
будет AsyncTask достаточно для этого, или я должен использовать IntentService?
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 мы не может выполнить загрузку файла BAsyncTask(Так как мы получаем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для некоторых задач, которые начинаются, заканчиваются, взаимодействуют с пользовательским интерфейсом в 1Activity- я часто использую
IntentServiceдля некоторых задач, которые могут старт/финиш и взаимодействовать или не взаимодействовать с UI из любогоActivityэтот ответ основан на моем тесте. Пожалуйста, поправьте меня, если я ошибаюсь. Надеюсь, это поможет.
Я согласен с @DeeV и @ebarrenechea о Intent service в части того, что вы должны использовать его для задач, которые не тесно связаны с деятельностью, такой как загрузка некоторых данных на сервер или хранение данных с сервера в базу данных.
но начиная с Android 3.0 были введены загрузчики API, который должен заменить AsyncTask. Так например для загрузки списка, который вы должны отобразить в деятельности лучше использовать загрузчик, который предназначен для обработки хорошо все изменения конфигурации и жизненный цикл деятельности.
Comments