Содержание....6
Об авторах....12
Предисловие....14
Кому адресована эта книга....15
Почему мы написали эту книгу....16
Как организована эта книга....16
Условные обозначения и соглашения....17
Примеры кода....18
Благодарности....18
ГЛАВА 1. Основы языка Kotlin....20
Система типов Kotlin....21
Примитивные типы....21
Null-безопасность....22
Тип Unit....24
Функциональные типы....25
Обобщенные типы....26
Переменные и функции....26
Переменные....27
Лямбда-выражения....27
Функции-расширения....28
Классы....30
Инициализация класса....30
Свойства....32
Модификатор lateinit....33
Свойства с отложенной инициализацией....35
Делегаты....36
Объекты-компаньоны....37
Классы данных....38
Классы перечислений....39
Запечатанные классы....41
Модификаторы видимости....42
Резюме....43
ГЛАВА 2. Фреймворк коллекций Kotlin....46
Основные понятия....46
Совместимость с Java....47
Изменяемость....47
Перегруженные операторы....49
Создание контейнеров....50
Функциональное программирование....51
Сравнение функционального и процедурного программирования: простой пример....51
Функциональное программирование в Android....52
Функции-преобразователи....53
Булевы функции....53
Фильтры....54
Функция тар....54
Функция flatMap....56
Группировка....57
Сравнение итераторов и последовательностей....58
Пример....60
Проблема....60
Реализация....61
Резюме....67
ГЛАВА 3. Основы Android....68
Стек Android....68
Аппаратное обеспечение....68
Ядро....69
Системные службы....69
Среда выполнения Android....70
Приложения....70
Прикладное окружение Android....70
Намерения и фильтры намерений....71
Контекст....74
Компоненты приложения Android: строительные блоки....76
Компонент Activity и его друзья....77
Службы....81
Провайдеры контента....86
BroadcastReceiver....87
Архитектуры приложений Android....89
MVC: основы....89
Виджеты....90
Локальная модель....90
Паттерны Android....91
Model-View-Intent....91
Model-View-Presenter....91
Model-View-ViewModel....92
Резюме....93
ГЛАВА 4. Параллельное программирование в Android....95
Потокобезопасность....96
Атомарность....96
Видимость....97
Модель многопоточного выполнения Android....98
Пропуск кадров....99
Утечка памяти....102
Инструменты для управления потоками....104
Looper/Handler....105
Исполнители Executors и объекты ExecutorService....107
Инструменты для управления заданиями....108
JobScheduler....110
WorkManager....112
Резюме....113
ГЛАВА 5. Потокобезопасность....114
Пример проблемы, связанной с потокобезопасностью....114
Инварианты....116
Мьютексы....117
Потокобезопасные коллекции....117
Привязка к потоку....120
Конфликт потоков....121
Сравнение блокирующего и неблокирующего вызовов....122
Очереди работ....123
Противодавление....124
Резюме....126
ГЛАВА 6. Организация параллелизма с использованием обратных вызовов....128
Пример: функция обработки покупок....129
Создание приложения....131
Компонент ViewModel....131
Представление....132
Реализация логики....136
Обсуждение....137
Ограничения модели многопоточного выполнения....139
Резюме....140
ГЛАВА 7. Сопрограммы....142
Что такое сопрограмма?....142
Наша первая сопрограмма....143
Функция async....145
Краткий обзор структурированного параллелизма....147
Связь "родитель — потомок" в структурированном параллелизме....149
CoroutineScope и CoroutineContext....151
Функции, поддерживающие возможность приостановки....156
Функции, поддерживающие возможность приостановки, ’’под капотом”....157
Использование сопрограмм и функций, поддерживающих возможность приостановки: практический пример....161
Не ошибитесь с модификатором suspend....164
Резюме....165
ГЛАВА 8. Структурированный параллелизм и сопрограммы....167
Функции, поддерживающие возможность приостановки....167
Настройка места действия....168
Традиционный подход с использованием java.util.concurrent.ExecutorService....169
Вспомним, что такое HandlerThread....173
Использование приостанавливаемых функций и сопрограмм....176
Сравнение приостанавливаемых и традиционной многопоточности: итоги....180
Отмена....180
Жизненный цикл сопрограмм....181
Отмена сопрограммы....183
Отмена задачи, делегированной сторонней библиотеке....185
Сопрограммы, которые действуют согласованно, чтобы их можно было отменить....189
Функцию delay() можно отменить....191
Обработка отмены....192
Причины отмены....193
Супервизия....196
Функция supervisorScope....198
Параллельная декомпозиция....198
Автоматическая отмена....200
Обработка исключений....200
Необработанные и открытые исключения....200
Открытые исключения....202
Необработанные исключения....205
Резюме....208
Размышления напоследок....209
ГЛАВА 9. Каналы....210
Обзор каналов....210
Рандеву-канал....212
Неограниченный канал....216
Объединенный канал....217
Буферизованный канал....218
Функция produce....219
Взаимодействующие последовательные процессы....220
Модель и архитектура....220
Первая реализация....221
Выражение select....226
Собираем все воедино....228
Мультиплексор и демультиплексор....229
Проверка производительности....230
Противодавление....232
Сходства с моделью акторов....233
Последовательное выполнение внутри процесса....233
Размышления напоследок....234
Взаимоблокировки в CSP....234
Каналы и взаимоблокировки....237
Ограничения каналов....237
«Горячие» каналы....239
Резюме....240
ГЛАВА 10. Потоки....242
Введение в потоки....242
Более реалистичный пример....243
Операторы....245
Терминальные операторы....246
Примеры использования холодного потока....247
Вариант 1: интерфейс с API на базе функции обратного вызова....247
Вариант 2: параллельное преобразование потока значений....252
Вариант 3: создание собственного оператора....254
Обработка ошибок....258
Блок try/catch....258
Разделение ответственности важно....261
Нарушение прозрачности исключения....261
Оператор catch....262
Материализация исключений....265
Горячие потоки и SharedFlow....268
Создаем Shared Flow....269
Регистрируем подписчика....269
Отправляем значения в SharedFlow....270
Использование SharedFlow для потоковой передачи данных....270
Использование SharedFlow в качестве шины событий....276
StateFlow. специализированная версия SharedFlow....277
Пример использования StateFlow....278
Резюме....280
ГЛАВА 11. Вопросы производительности и инструменты профилирования Android....281
Android Profiler....283
Network Profiler....286
CPU Profiler....292
Energy Profiler....302
Memory Profiler....304
Обнаружение утечек памяти с помощью LeakCanary....309
Резюме....313
ГЛАВА 12. Снижение потребления ресурсов за счет оптимизации производительности....315
Достижение плоской иерархии представлений с помощью ConstraintLayout....316
Сокращение количества операций рисования с помощью экземпляров класса Drawable....320
Минимизация данных в сетевых вызовах....325
Организация пула и кэширование объектов Bitmap....325
Избавляемся от ненужной работы....327
Использование статических функций....330
Минификация и обфускация с R8 и ProGuard....330
Резюме....332
Предметный указатель....334
Книга посвящена разработке мобильных приложений для Android на языке Kotlin. Рассмотрены основные структуры и элементы языка, подробно описан фреймворк коллекций Kotlin. Показана архитектура операционной системы Android, приложений и их контейнеров, изучаются основы параллельного программирования. Рассказано о потокобезопасности, работе с параллелизмом с использованием обратных вызовов. Отдельная глава посвящена специальным конструкциям Kotlin — сопрограммам, с акцентом на структурированный параллелизм. Рассматриваются каналы, использование потоков для асинхронной обработки данных. Изучаются вопросы повышения производительности приложений с использованием инструментов профилирования Android и снижения потребления ресурсов за счет оптимизации производительности.
Для программистов
Разработка мобильных приложений для Android может показаться сложной задачей, особенно если для этого требуется изучить новый язык программирования. Речь идет о Kotlin, ставшем официальным языком разработки для этой операционной системы. Книга поможет быстро освоить этот язык, обладающий целым рядом технологических преимуществ, а также перейти с Java на Kotlin.
Авторы приводят реализацию наиболее распространенных задач в нативной разработке для Android и показывают, как Kotlin помогает решить проблему параллелизма. Делая акцент на структурированном параллелизме, новой парадигме асинхронного программирования, книга помогает освоить одну из самых мощных конструкций Kotlin — сопрограммы.