Лекция
Привет, Вы узнаете о том , что такое особенности service, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое особенности service, asynctask в android-приложениях , настоятельно рекомендую прочитать все из категории Программирование мобильных устройств Android и IOs.
Цель статьи – объяснить особенности использования Service и asynctask в android-приложениях . Материал предполагает, что читатель имеет некоторый опыт в разработке приложений под Android.
Каждый пишущий под Android знает про UI thread. По умолчанию все процессы выполняются в этом потоке, и у приложения есть не более пяти секунд, чтобы выполнить сложные вычисления. Всего пять секунд… Но представьте, что приложение на телефоне «замерзло» и не отвечает на ваши действия целых пять секунд, особенно если вам пришел важный звонок. Это крайне неприятно. Чтобы этого не произошло, все долгие операции должны выполняться в отдельных потоках.
Для асинхронного выполнения задач, помимо стандартного пакета java.util.concurrent, Android предоставляет собственные подходы для работы с потоками: Service и AsyncTask.
Что такое Service? Это один из четырех основных компонентов системы, позволяющий выполнить задачу в фоне без необходимости участия пользователя. Т. е. это способ сделать что-то, пока пользователь работает с нашим приложением – с одной из наших Activity. Поскольку Service выполняет задачу в фоне, создается ложное впечатление, что работа идет в отдельном потоке, однако это не так: обычный Service работает в UI thread, и для долгих вычислений по-прежнему нужно породить поток.
Разработчики Android подумали о нас и предоставили IntentService. Он самостоятельно запускает поток на каждый пришедший Intent. Об этом говорит сайт https://intellect.icu . Поток всего один, поэтому все пришедшие Intent-объекты будут поставлены в очередь и выполнены последовательно друг за другом.
AsyncTask, как и IntentService, позволяет выполнить задачу в отдельном потоке. Но, в отличие от IntentService, AsyncTask имеет доступ к UI thread – контексту нашей Activity и, соответственно, интерфейсу, что позволяет обновить экран напрямую из класса.
Казалось бы, все просто: если нужно выполнить долгую операцию, пишем Service, если нужно еще и взаимодействие с интерфейсом, пишем AsyncTask… но дьявол, как говорится, в деталях…
AsyncTask зависит от контекста Activity, из которой был запущен. Именно поэтому он и может обновить экран. Однако это также и слабая сторона AsyncTask, поскольку контекст может быть утерян. Например, при повороте экрана, нажатии клавиши BACK или приеме входящего звонка. В этих случаях система разрушит нашу Activity и создаст заново, но контекст в запущенном ранее AsyncTask останется прежний, т. е. после выполнения работы в потоке наш класс попытается обратиться к интерфейсу, которого уже не существует.
Чтобы избежать этого, нужно как-то проверять актуальность контекста в нашем AsyncTask , что усложняет логику нашего приложения. Не лучше ли потратить чуть больше времени и реализовать IntentService?
При попытке обратиться к Activity, наше приложение упадет.
Представьте, что при каждом возвращении к Activity вам нужно выполнить какие-то действия в AsyncTask и обновить экран. Т. е. каждый раз, когда пользователь переворачивает экран, система будет уничтожать Activity и создавать заново на вершине стека, тем самым повторно запуская код в AsyncTask.
Что случится с нашим приложением? Некорректное поведение или крах системы? Трудно сказать. Проблема такого рода ошибок в том, что их трудно отловить. Разрабатывая проект на эмуляторе, обычно не вертишь его, и данный тип ошибок остается незамеченным. Хорошо, если есть команда тестеров, которая поможет отловить столь неочевидные ошибки перед передачей приложения пользователям.
Еще одно свойство AsyncTask’ов – один экземпляр класса можно запустить лишь единожды. Если вам нужнонесколько раз выполнить необходимый код в отдельном потоке при помощи AsyncTask, придtтся создать соответствующее количество объектов.
Это не будет работать:
MyAsyncTask task = new MyAsyncTask();
for (int i = 0; i < 1000; i++) {
task.execute(someKindOfData);
}
А вот этот код возможен:
for (int i = 0; i < 1000; i++) {
MyAsyncTask task = new MyAsyncTask();
task.execute(someKindOfData);
}
У вас могло сложиться впечатление, что я с неодобрением отношусь к использованию AsyncTask’ов в проектах. Так и есть, но справедливости ради стоит отметить, что приемлемо использовать их для чтения данных из файла или базы данных, хотя в последнем случае лучше использовать AsyncQueryHandler.
Теперь вам известен ряд затруднений, которые может вызвать использование AsyncTask’ов в вашем коде. Service не имеет этих недостатков. Это отдельный компонент системы, не завязанный на Context вашего приложения, что позволяет полноценно разделять логику и отображение в вашем проекте.
Кроме того, когда Service затребует больше памяти, вы всегда сможете одной строчкой в манифесте вынести его в отдельный процесс. Наконец, Service позволит контролировать запросы к серверу, их очередность. Используйте его!
Выводы из данной статьи про особенности service указывают на необходимость использования современных методов для оптимизации любых систем. Надеюсь, что теперь ты понял что такое особенности service, asynctask в android-приложениях и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Программирование мобильных устройств Android и IOs
Из статьи мы узнали кратко, но содержательно про особенности service
Комментарии
Оставить комментарий
Программирование мобильных устройств Android и IOs
Термины: Программирование мобильных устройств Android и IOs