Содержание Об авторах Предисловие Кому адресована эта книга Почему мы написали эту книгу Как организована эта книга Условные обозначения и соглашения Примеры кода Благодарности ГЛАВА 1. Основы языка Kotlin Система типов Kotlin Примитивные типы Null-безопасность Тип Unit Функциональные типы Обобщенные типы Переменные и функции Переменные Лямбда-выражения Функции-расширения Классы Инициализация класса Свойства Модификатор lateinit Свойства с отложенной инициализацией Делегаты Объекты-компаньоны Классы данных Классы перечислений Запечатанные классы Модификаторы видимости Резюме ГЛАВА 2. Фреймворк коллекций Kotlin Основные понятия Совместимость с Java Изменяемость Перегруженные операторы Создание контейнеров Функциональное программирование Сравнение функционального и процедурного программирования: простой пример Функциональное программирование в Android Функции-преобразователи Булевы функции Фильтры Функция тар Функция flatMap Группировка Сравнение итераторов и последовательностей Пример Проблема Реализация Резюме ГЛАВА 3. Основы Android Стек Android Аппаратное обеспечение Ядро Системные службы Среда выполнения Android Приложения Прикладное окружение Android Намерения и фильтры намерений Контекст Компоненты приложения Android: строительные блоки Компонент Activity и его друзья Службы Провайдеры контента BroadcastReceiver Архитектуры приложений Android MVC: основы Виджеты Локальная модель Паттерны Android Model-View-Intent Model-View-Presenter Model-View-ViewModel Резюме ГЛАВА 4. Параллельное программирование в Android Потокобезопасность Атомарность Видимость Модель многопоточного выполнения Android Пропуск кадров Утечка памяти Инструменты для управления потоками Looper/Handler Исполнители Executors и объекты ExecutorService Инструменты для управления заданиями JobScheduler WorkManager Резюме ГЛАВА 5. Потокобезопасность Пример проблемы, связанной с потокобезопасностью Инварианты Мьютексы Потокобезопасные коллекции Привязка к потоку Конфликт потоков Сравнение блокирующего и неблокирующего вызовов Очереди работ Противодавление Резюме ГЛАВА 6. Организация параллелизма с использованием обратных вызовов Пример: функция обработки покупок Создание приложения Компонент ViewModel Представление Реализация логики Обсуждение Ограничения модели многопоточного выполнения Резюме ГЛАВА 7. Сопрограммы Что такое сопрограмма? Наша первая сопрограмма Функция async Краткий обзор структурированного параллелизма Связь "родитель — потомок" в структурированном параллелизме CoroutineScope и CoroutineContext Функции, поддерживающие возможность приостановки Функции, поддерживающие возможность приостановки, ’’под капотом” Использование сопрограмм и функций, поддерживающих возможность приостановки: практический пример Не ошибитесь с модификатором suspend Резюме ГЛАВА 8. Структурированный параллелизм и сопрограммы Функции, поддерживающие возможность приостановки Настройка места действия Традиционный подход с использованием java.util.concurrent.ExecutorService Вспомним, что такое HandlerThread Использование приостанавливаемых функций и сопрограмм Сравнение приостанавливаемых и традиционной многопоточности: итоги Отмена Жизненный цикл сопрограмм Отмена сопрограммы Отмена задачи, делегированной сторонней библиотеке Сопрограммы, которые действуют согласованно, чтобы их можно было отменить Функцию delay() можно отменить Обработка отмены Причины отмены Супервизия Функция supervisorScope Параллельная декомпозиция Автоматическая отмена Обработка исключений Необработанные и открытые исключения Открытые исключения Необработанные исключения Резюме Размышления напоследок ГЛАВА 9. Каналы Обзор каналов Рандеву-канал Неограниченный канал Объединенный канал Буферизованный канал Функция produce Взаимодействующие последовательные процессы Модель и архитектура Первая реализация Выражение select Собираем все воедино Мультиплексор и демультиплексор Проверка производительности Противодавление Сходства с моделью акторов Последовательное выполнение внутри процесса Размышления напоследок Взаимоблокировки в CSP Каналы и взаимоблокировки Ограничения каналов «Горячие» каналы Резюме ГЛАВА 10. Потоки Введение в потоки Более реалистичный пример Операторы Терминальные операторы Примеры использования холодного потока Вариант 1: интерфейс с API на базе функции обратного вызова Вариант 2: параллельное преобразование потока значений Вариант 3: создание собственного оператора Обработка ошибок Блок try/catch Разделение ответственности важно Нарушение прозрачности исключения Оператор catch Материализация исключений Горячие потоки и SharedFlow Создаем Shared Flow Регистрируем подписчика Отправляем значения в SharedFlow Использование SharedFlow для потоковой передачи данных Использование SharedFlow в качестве шины событий StateFlow. специализированная версия SharedFlow Пример использования StateFlow Резюме ГЛАВА 11. Вопросы производительности и инструменты профилирования Android Android Profiler Network Profiler CPU Profiler Energy Profiler Memory Profiler Обнаружение утечек памяти с помощью LeakCanary Резюме ГЛАВА 12. Снижение потребления ресурсов за счет оптимизации производительности Достижение плоской иерархии представлений с помощью ConstraintLayout Сокращение количества операций рисования с помощью экземпляров класса Drawable Минимизация данных в сетевых вызовах Организация пула и кэширование объектов Bitmap Избавляемся от ненужной работы Использование статических функций Минификация и обфускация с R8 и ProGuard Резюме Предметный указатель Developing applications for the Android mobile operating system can seem daunting, particularly if it requires learning a new programming language: Kotlin, now Android's official development language. With this practical book, Android developers will learn how to make the transition from Java to Kotlin, including how Kotlin provides a true advantage for gaining control over asynchronous computations. Authors Pierre-Olivier Laurence, Amanda Hinchman-Dominguez, G. Blake Meike, and Mike Dunn explore implementations of the most common tasks in native Android development, and show you how Kitlin can help you solve concurrency problems. With a focus on structured concurrency, a new asynchronous programming paradigm, this book will guide you through one of Kotlin's most powerful constructs, coroutines Developing applications for the Android mobile operating system can seem daunting, particularly if it requires learning a new programming Kotlin, now Android??s official development language. With this practical book, Android developers will learn how to make the transition from Java to Kotlin, including how Kotlin provides a true advantage for gaining control over asynchronous computations. Authors Pierre-Olivier Laurence, Amanda Hinchman-Dominguez, G. Blake Meike, and Mike Dunn explore implementations of the most common tasks in native Android development, and show you how Kotlin can help you solve concurrency problems. With a focus on structured concurrency, a new asynchronous programming paradigm, this book will guide you through one of Kotlin's most powerful constructs, coroutines.