Книга посвящена разработке мобильных приложений для Android на языке Kotlin. Рассмотрены основные структуры и элементы языка, подробно описан фреймворк коллекций Kotlin. Показана архитектура операционной системы Android, приложений и их контейнеров, изучаются основы параллельного программирования. Рассказано о потокобезопасности, работе с параллелизмом с использованием обратных вызовов. Отдельная глава посвящена специальным конструкциям Kotlin — сопрограммам, с акцентом на структурированный параллелизм. Рассматриваются каналы, использование потоков для асинхронной обработки данных. Изучаются вопросы повышения производительности приложений с использованием инструментов профилирования Android и снижения потребления ресурсов за счет оптимизации производительности.
Для программистов
Разработка мобильных приложений для Android может показаться сложной задачей, особенно если для этого требуется изучить новый язык программирования. Речь идет о Kotlin, ставшем официальным языком разработки для этой операционной системы. Книга поможет быстро освоить этот язык, обладающий целым рядом технологических преимуществ, а также перейти с Java на Kotlin.
Авторы приводят реализацию наиболее распространенных задач в нативной разработке для Android и показывают, как Kotlin помогает решить проблему параллелизма. Делая акцент на структурированном параллелизме, новой парадигме асинхронного программирования, книга помогает освоить одну из самых мощных конструкций Kotlin — сопрограммы.
- Познакомьтесь с основами Kotlin и его фреймворком коллекций
- Изучите операционную систему Android, контейнер приложения и его компоненты
- Познакомьтесь с потокобезопасностью и узнайте, как работать с параллелизмом
- Пишите последовательный асинхронный код с низкими затратами
- Изучите структурированный параллелизм с помощью сопрограмм и узнайте, как сопрограммы взаимодействуют между собой с помощью каналов
- Узнайте, как использовать потоки для асинхронной обработки данных
- Изучите вопросы производительности с помощью инструментов профилирования
- Оптимизируйте производительность, чтобы сократить потребление ресурсов
Об авторах. 11
Предисловие. 13
Кому адресована эта книга. 14
Почему мы написали эту книгу. 15
Как организована эта книга. 15
Условные обозначения и соглашения. 16
Примеры кода. 17
Благодарности. 17
ГЛАВА 1. Основы языка Kotlin. 19
Система типов Kotlin. 20
Примитивные типы. 20
Null-безопасность. 21
Тип Unit 23
Функциональные типы. 24
Обобщенные типы. 25
Переменные и функции. 25
Переменные. 26
Лямбда-выражения. 26
Функции-расширения. 27
Классы. 29
Инициализация класса. 29
Свойства. 31
Модификатор lateinit 32
Свойства с отложенной инициализацией. 34
Делегаты. 35
Объекты-компаньоны. 36
Классы данных. 37
Классы перечислений. 38
Запечатанные классы. 40
Модификаторы видимости. 41
Резюме. 42
ГЛАВА 2. Фреймворк коллекций Kotlin. 45
Основные понятия. 45
Совместимость с Java. 46
Изменяемость. 46
Перегруженные операторы. 48
Создание контейнеров. 49
Функциональное программирование. 50
Сравнение функционального и процедурного программирования:
простой пример. 50
Функциональное программирование в Android. 51
Функции-преобразователи. 52
Булевы функции. 52
Фильтры. 53
Функция map. 53
Функция flatMap. 55
Группировка. 56
Сравнение итераторов и последовательностей. 57
Пример. 59
Проблема. 59
Реализация. 60
Резюме. 66
ГЛАВА 3. Основы Android. 67
Стек Android. 67
Аппаратное обеспечение. 67
Ядро. 68
Системные службы. 68
Среда выполнения Android. 69
Приложения. 69
Прикладное окружение Android. 69
Намерения и фильтры намерений. 70
Контекст. 73
Компоненты приложения Android: строительные блоки. 75
Компонент Activity и его друзья. 76
Службы. 80
Провайдеры контента. 85
BroadcastReceiver 86
Архитектуры приложений Android. 88
MVC: основы. 88
Виджеты. 89
Локальная модель. 89
Паттерны Android. 90
Model-View-Intent 90
Model-View-Presenter 90
Model-View-ViewModel 91
Резюме. 92
ГЛАВА 4. Параллельное программирование в Android. 94
Потокобезопасность. 95
Атомарность. 95
Видимость. 96
Модель многопоточного выполнения Android. 97
Пропуск кадров. 98
Утечка памяти. 101
Инструменты для управления потоками. 103
Looper/Handler 104
Исполнители Executors и объекты ExecutorService. 106
Инструменты для управления заданиями. 107
JobScheduler 109
WorkManager 111
Резюме. 112
ГЛАВА 5. Потокобезопасность. 113
Пример проблемы, связанной с потокобезопасностью.. 113
Инварианты. 115
Мьютексы. 116
Потокобезопасные коллекции. 116
Привязка к потоку. 119
Конфликт потоков. 120
Сравнение блокирующего и неблокирующего вызовов. 121
Очереди работ. 122
Противодавление. 123
Резюме. 125
ГЛАВА 6. Организация параллелизма с использованием обратных вызовов. 127
Пример: функция обработки покупок. 128
Создание приложения. 130
Компонент ViewModel 130
Представление. 131
Реализация логики. 135
Обсуждение. 136
Ограничения модели многопоточного выполнения. 138
Резюме. 139
ГЛАВА 7. Сопрограммы.. 141
Что такое сопрограмма?. 141
Наша первая сопрограмма. 142
Функция async. 144
Краткий обзор структурированного параллелизма. 146
Связь “родитель — потомок” в структурированном параллелизме. 148
CoroutineScope и CoroutineContext 150
Функции, поддерживающие возможность приостановки. 155
Функции, поддерживающие возможность приостановки, “под капотом”. 156
Использование сопрограмм и функций, поддерживающих возможность
приостановки: практический пример. 160
Не ошибитесь с модификатором suspend. 163
Резюме. 164
ГЛАВА 8. Структурированный параллелизм и сопрограммы.. 166
Функции, поддерживающие возможность приостановки. 166
Настройка места действия. 167
Традиционный подход с использованием java.util.concurrent.ExecutorService. 168
Вспомним, что такое HandlerThread. 172
Использование приостанавливаемых функций и сопрограмм. 175
Сравнение приостанавливаемых и традиционной многопоточности: итоги. 179
Отмена. 179
Жизненный цикл сопрограмм. 180
Отмена сопрограммы. 182
Отмена задачи, делегированной сторонней библиотеке. 184
Сопрограммы, которые действуют согласованно, чтобы их можно было отменить. 188
Функцию delay() можно отменить. 190
Обработка отмены. 191
Причины отмены. 192
Супервизия. 195
Функция supervisorScope. 197
Параллельная декомпозиция. 197
Автоматическая отмена. 199
Обработка исключений. 199
Необработанные и открытые исключения. 199
Открытые исключения. 201
Необработанные исключения. 204
Резюме. 207
Размышления напоследок. 208
ГЛАВА 9. Каналы.. 209
Обзор каналов. 209
Рандеву-канал. 211
Неограниченный канал. 215
Объединенный канал. 216
Буферизованный канал. 217
Функция produce. 218
Взаимодействующие последовательные процессы. 219
Модель и архитектура. 219
Первая реализация. 220
Выражение select 225
Собираем все воедино. 227
Мультиплексор и демультиплексор. 228
Проверка производительности. 229
Противодавление. 231
Сходства с моделью акторов. 232
Последовательное выполнение внутри процесса. 232
Размышления напоследок. 233
Взаимоблокировки в CSP. 233
Каналы и взаимоблокировки. 236
Ограничения каналов. 236
“Горячие” каналы. 238
Резюме. 239
ГЛАВА 10. Потоки. 241
Введение в потоки. 241
Более реалистичный пример. 242
Операторы. 244
Терминальные операторы. 245
Примеры использования холодного потока. 246
Вариант 1: интерфейс с API на базе функции обратного вызова. 246
Вариант 2: параллельное преобразование потока значений. 251
Вариант 3: создание собственного оператора. 253
Обработка ошибок. 257
Блок try/catch. 257
Разделение ответственности важно. 260
Нарушение прозрачности исключения. 260
Оператор catch. 261
Материализация исключений. 264
Горячие потоки и SharedFlow. 267
Создаем SharedFlow. 268
Регистрируем подписчика. 268
Отправляем значения в SharedFlow. 269
Использование SharedFlow для потоковой передачи данных. 269
Использование SharedFlow в качестве шины событий. 275
StateFlow: специализированная версия SharedFlow. 276
Пример использования StateFlow. 277
Резюме. 279
ГЛАВА 11. Вопросы производительности и инструменты
профилирования Android. 280
Android Profiler 282
Network Profiler 285
CPU Profiler 291
Energy Profiler 301
Memory Profiler 303
Обнаружение утечек памяти с помощью LeakCanary. 308
Резюме. 312
ГЛАВА 12. Снижение потребления ресурсов за счет оптимизации производительности 314
Достижение плоской иерархии представлений с помощью ConstraintLayout 315
Сокращение количества операций рисования с помощью экземпляров
класса Drawable. 319
Минимизация данных в сетевых вызовах. 324
Организация пула и кэширование объектов Bitmap. 324
Избавляемся от ненужной работы. 326
Использование статических функций. 329
Минификация и обфускация с R8 и ProGuard. 329
Резюме. 331
Предметный указатель. 333
Майк Данн (Mike Dunn) работал ведущим инженером по мобильным технологиям в издательстве O’Reilly Media.Один из авторов книги «Нативная разработка мобильных приложений. Перекрестный справочник для iOS и Android».
Пьер-Оливье Лоранс (Pierre-Olivier Laurence) — ведущий инженер-программист компании Safran Aircraft Engines, со штаб-квартирой в окрестностях Парижа.
Дж. Блейк Мик (G. Blake Meike) — старший инженер-программист компании Couchbase и автор нескольких книг, среди которых «Программирование под Android».
Аманда Хинчман-Домингес (Amanda Hinchman-Dominguez) — эксперт по языку Kotlin в программе Google Developer Expert. Работает разработчиком для Android в компании Groupon и является активным участником глобального сообщества Kotlin.
-
Программирование на Kotlin для Android
1100₽
935₽