May 17, 2024

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:00:49 Пример реализации

• В примере кода показано, как правильно использовать асиктаску для загрузки файла при изменении ориентации устройства.
• В результате, при повороте устройства, состояние загрузки файла не меняется, и файл загружается только один раз.

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 и его инструменты достаточно для большинства задач.