3. Android-разработка. Асинхронная работа | Технострим
3. Android-разработка. Асинхронная работа | Технострим
https://www.youtube.com/watch?v=otQnykd4vvA
00:05 Синхронная работа в Android
• Обсуждение темы лекции: синхронная работа в Android.
• Обсуждение основных понятий: приложение, процесс, поток, главный поток, лупер, месседж-кью, хендлер.
08:01 Взаимодействие между потоками
• Обсуждение основных механизмов взаимодействия между потоками: лупер, месседж-кью, хендлер.
• Обсуждение методов и классов, используемых для взаимодействия между потоками.
14:09 Рекомендации по работе с потоками
• Рекомендации по работе с главным потоком: не выполнять длительные операции, не выполнять операции, связанные с файловой системой.
• Ограничение на время выполнения обработчиков сообщений на главном потоке: не более 16 миллисекунд.
• Возможные артефакты при нарушении рекомендаций: артефакты в отрисовке пользовательского интерфейса, анимации, взаимодействии пользователя с интерфейсом.
17:07 Оптимизация работы с потоками
• Не рекомендуется выполнять сетевые запросы и операции с базами данных в фоновых потоках, так как это может привести к снижению производительности.
• Для решения задач в фоновых потоках рекомендуется использовать фоновые потоки, такие как AsyncTask и Looper.
21:42 Взаимодействие с фоновыми потоками
• Создание и уничтожение потоков может быть дорогостоящей операцией, поэтому рекомендуется использовать пулы потоков.
• Для выполнения задач в фоновом режиме можно использовать сервис или интенент сервис.
34:42 Публикация результатов в главном потоке
• Для передачи результатов из фонового потока в главный поток можно использовать экзекьютор или интенент сервис.
35:57 Жизненный цикл активити и использование асинхронных задач
• В видео обсуждается проблема жизненного цикла активити и использование асинхронных задач для загрузки картинок.
• Асинхронные задачи позволяют загружать картинки в фоновом режиме, но могут привести к ошибкам, если активити будет уничтожено до завершения загрузки.
• Для решения этой проблемы можно использовать методы, которые проверяют, жива ли активити, и методы, которые позволяют публиковать результаты загрузки в главном потоке.
50:42 Пример использования асинхронной задачи для загрузки картинки
• В примере демонстрируется использование асинхронной задачи для загрузки картинки в активити.
• Задача создается в конструкторе активити и передается в метод оттачи для уведомления о смене ориентации активити.
• Метод апдейтвью вызывается всякий раз, когда есть данные или меняется активити, и метод вью используется для публикации данных в активити.
54:05 Синхронизация между активити и таской
• В видео объясняется, как использовать метод ритей конфигур инстанс для сохранения состояния активити между пересозданиями.
• Этот метод вызывается перед вызовом метода от дистроя, когда активити пересоздается.
• В примере кода показано, как правильно использовать асиктаску для загрузки файла при изменении ориентации устройства.
• В результате, при повороте устройства, состояние загрузки файла не меняется, и файл загружается только один раз.
01:08:34 Проблемы с использованием асиктаски
• Асиктаска не способна автоматически распознавать ситуации, когда конечный таргет меняется или больше не существует.
• Поэтому, для корректной работы с такими ситуациями, необходимо писать дополнительный код.
01:10:20 Загрузка файла в юном потоке
• В примере показано, как загрузить файл в юном потоке, но это приводит к ошибке "нетворк майн тред эксцепшен".
• Чтобы избежать этой ошибки, можно использовать метод тред полиси для изменения политики поведения в данной ситуации.
01:14:39 Синтаксис и взаимодействие с Android
• В видео обсуждаются различные способы создания и использования асинхронных задач в Android.
• В частности, рассматривается пример с использованием класса AsyncTask, который позволяет выполнять сетевые запросы и обновлять пользовательский интерфейс.
• Однако, в этом примере есть некоторые недостатки, связанные с тем, что AsyncTask не учитывает возможность пересоздания активити.
01:20:45 Правильное использование AsyncTask
• В этом разделе объясняется, как правильно использовать AsyncTask для загрузки данных при пересоздании активити.
• В этом случае, AsyncTask должен быть объявлен как статический метод, и в его конструкторе должен быть передан указатель на активити, в которой он будет выполняться.
• Также, в методе onDestroy активити, необходимо вызвать метод AsyncTask для освобождения ресурсов.
01:27:16 Утечки памяти и слабые ссылки
• В этом разделе обсуждаются возможные утечки памяти при использовании AsyncTask.
• Если есть неуверенность в том, что все будет работать корректно, рекомендуется использовать слабые ссылки для хранения указателей на объекты.
• В Android есть класс WeakReference, который позволяет хранить слабые ссылки на объекты, которые могут быть освобождены, если на них нет других сильных ссылок.
• В заключение, автор подчеркивает, что важно понимать, как правильно использовать AsyncTask и слабые ссылки для предотвращения утечек памяти.
01:32:28 Работа с жизненным циклом активити
• В видео обсуждается использование вики-референсов для хранения ссылок на активити, однако это может привести к проблемам с жизненным циклом активити.
• Вместо этого рекомендуется хранить строгий указатель на активити, чтобы избежать утечек памяти и проблем с жизненным циклом.
01:36:15 Лодеры и их использование
• Лодеры - это версия 7-таск, которая позволяет более эффективно работать с фоновыми задачами и взаимодействовать с главным потоком.
• Синтаксис лодеров по умолчанию использует один поток, но может быть изменен с помощью метода execute.
• Лодеры также могут быть использованы для взаимодействия с фрагментами, позволяя переиспользовать одни и те же лодеры между разными фрагментами.
01:38:24 Рикс Джава и другие фреймворки
• Рикс Джава - это фреймворк, основанный на коллбеках и об серверах, который позволяет конфигурировать выполнение задач и загрузку данных в разных потоках.
• В видео также упоминаются другие сторонние фреймворки, которые могут быть использованы для решения тех же задач, но автор считает, что Android SDK и его инструменты достаточно для большинства задач.