Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Особенности Service и AsyncTask в Android-приложениях

Лекция



Привет, Вы узнаете о том , что такое особенности 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?

Особенности Service и AsyncTask в Android-приложениях

При попытке обратиться к 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
создано: 2016-08-02
обновлено: 2024-11-12
106



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Программирование мобильных устройств Android и IOs

Термины: Программирование мобильных устройств Android и IOs