УДК 004.451.9Android:004.451.2
ББК 32.972.11
Г11
Г11 Эффективное использование потоков в операционной системе
Android / пер. с англ. А. Снастина. – М.: ДМК Пресс, 2018. –
312 с.: ил.
Ёранссон А.
ISBN 978-5-97060-182-2
Чтобы написать действительно полезное и удобное приложение для Android,
то без многопоточности никак не обойтись, но как узнать о технологиях и методиках,
которые помогут решить такую задачу? Книга с практической точки зрения
описывает несколько асинхронных механизмов, доступных в программной среде
Android SDK, а также рассматривает основные принципы и правила выбора одного
из этих них, лучше всего подходящего для создаваемого приложения.
Издание предназначено для программистов разной квалификации, уже работающих
под Android и желающих улучшить качество создаваемых программ.
УДК 004.451.9Android:004.451.2
ББК 32.972.11
Все права защищены. Любая часть этой книги не может быть воспроизведена
в какой бы то ни было форме и какими бы то ни было средствами без
письменного разрешения владельцев авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но поскольку
вероятность технических ошибок все равно существует, издательство
не может гарантировать абсолютную точность и правильность приводимых
сведений. В связи с этим издательство не несет ответственности за возможные
ошибки, связанные с использованием книги.
ISBN 978-1-449-36413-7 (анг.)
ISBN 978-5-97060-182-2 (рус.)
Copyright © Anders Gоransson..
© Оформление, перевод,
ДМК Пресс
Стр.5
Содержание
Предисловие............................................................13
Глава.1..Компоненты.ОС.Android.и.необходимость..
параллельных.вычислений..........................................19
Стек программной среды ОС Android ........................................................................19
Архитектура приложения ...............................................................................................21
Приложение .................................................................................................................21
Компоненты .................................................................................................................21
Activity ..................................................................................................................22
Service ....................................................................................................................24
ContentProvider..................................................................................................24
BroadcastReceiver ..............................................................................................25
Выполнение приложения ................................................................................................25
Процесс Linux .............................................................................................................25
Жизненный цикл .......................................................................................................26
Запуск приложения ..........................................................................................26
Завершение приложения ................................................................................27
Структурирование приложений для улучшения производительности .........29
Создание отзывчивых приложений с помощью потоков ............................30
Резюме ...................................................................................................................................32
Часть.I..Основы.........................................................33
Глава.2..Многопоточность.в.Java..................................34
Основы использования потоков ...................................................................................34
Выполнение .................................................................................................................35
Приложение с одним потоком ..............................................................................37
Многопоточное приложение .................................................................................37
Увеличение потребления ресурсов .............................................................38
Повышенная сложность ..................................................................................38
Нарушение целостности данных .................................................................38
Безопасное состояние потока ........................................................................................40
Внутренняя блокировка и монитор Java ...........................................................41
Синхронизация доступа к совместно используемым ресурсам ................43
Использование внутренней блокировки ...................................................43
Явное использование механизмов блокировки ......................................45
Пример: потребитель и производитель ..............................................................46
Стратегии выполнения задачи ......................................................................................48
Проектирование параллельного выполнения .................................................49
Резюме ...................................................................................................................................50
Стр.7
Содержание 7
Глава.3..Потоки.в.ОС.Android........................................51
Потоки приложения ОС Android .................................................................................51
UI-поток ........................................................................................................................51
Связующие потоки ....................................................................................................52
Фоновые потоки .........................................................................................................53
Процесс Linux и потоки ...................................................................................................53
Планирование .............................................................................................................57
Приоритет ............................................................................................................58
Управляющие группы ......................................................................................59
Резюме ...................................................................................................................................61
Глава.4..Взаимодействие.потоков................................62
Программные каналы .......................................................................................................62
Основы использования программного канала ................................................64
Пример: обработка текста в рабочем потоке ....................................................66
Совместно используемая память..................................................................................68
Механизм сигналов ...................................................................................................69
Блокирующая очередь BlockingQueue .......................................................................71
Передача сообщений в ОС Android .............................................................................73
Пример: простая передача сообщений ...............................................................74
Классы, используемые при реализации механизма передачи
сообщений ....................................................................................................................77
Класс MessageQueue .........................................................................................77
Интерфейс MessageQueue.IdleHandler ......................................................79
Пример: использование интерфейса IdleHandler
для завершения ненужного потока .............................................................80
Класс Message .............................................................................................................82
Состояние «инициализировано» .................................................................84
Состояние «ожидание» ...................................................................................85
Состояние «передано» .....................................................................................85
Состояние «готово к повторному использованию» ..............................85
Класс Looper ................................................................................................................86
Завершение работы объекта Looper ............................................................87
Объект Looper в UI-потоке ............................................................................88
Класс Handler ..............................................................................................................88
Создание и настройка ......................................................................................89
Создание сообщения ........................................................................................90
Вставка сообщения в очередь ........................................................................90
Пример: передача сообщений в двух направлениях .............................92
Обработка сообщений ......................................................................................95
Удаление сообщений из очереди ..........................................................................97
Наблюдение за очередью сообщений .................................................................99
Получение текущего состояния очереди сообщений ...........................99
Стр.8
8 Содержание
Отслеживание обработки очереди сообщений .....................................102
Взаимодействие с UI-потоком ....................................................................................103
Резюме .................................................................................................................................104
Глава.5..Взаимодействие.между.процессами...............105
Механизм вызова удалённых процедур в ОС Android .......................................105
Объект Binder............................................................................................................106
Язык AIDL ..........................................................................................................................108
Синхронные вызовы удалённых процедур .....................................................110
Асинхронные вызовы удалённых процедур ...................................................113
Передача сообщений с использованием объекта Binder ....................................115
Однонаправленное взаимодействие .................................................................117
Взаимодействие в двух направлениях .............................................................119
Резюме .................................................................................................................................120
Глава.6..Управление.памятью....................................121
Сборка мусора ...................................................................................................................121
Утечки памяти, связанные с использованием потоков .......................................123
Выполнение потока .................................................................................................125
Внутренние классы .........................................................................................126
Статические внутренние классы ................................................................127
Рассогласование жизненных циклов ........................................................128
Взаимодействие потоков .......................................................................................131
Отправка сообщения с данными ................................................................132
Передача сообщения с задачей ...................................................................133
Устранение утечек памяти ............................................................................................134
Использование статических внутренних классов ........................................135
Использование слабых ссылок ...........................................................................135
Остановка рабочего потока ..................................................................................136
Переключение рабочих потоков .........................................................................136
Очистка очереди сообщений ...............................................................................136
Резюме .................................................................................................................................137
Часть.II..Механизмы.асинхронного.выполнения............138
Глава.7..Управление.жизненным.циклом.простого..
потока...................................................................139
Основы использования потоков .................................................................................139
Жизненный цикл .....................................................................................................139
Прерывания ...............................................................................................................141
Неперехватываемые исключения ......................................................................143
Управление потоком .......................................................................................................145
Определение и запуск потока ..............................................................................145
Анонимный внутренний класс ...................................................................145
Стр.9
Содержание 9
Общедоступный поток ..................................................................................146
Определение потока как статического внутреннего класса .............146
Обзор возможных вариантов выбора определения потока ..............147
Сохранение потока в рабочем состоянии ........................................................147
Сохранение потока в рабочем состоянии средствами класса
Activity ................................................................................................................148
Сохранение потока в рабочем состоянии средствами класса
Fragment..............................................................................................................151
Резюме .................................................................................................................................153
Глава.8..HandlerThread:.механизм.очереди..
сообщений.высокого.уровня......................................155
Основы использования HandlerThread ....................................................................155
Жизненный цикл HandlerThread ...............................................................................157
Случаи использования ...................................................................................................159
Повторяющееся выполнение задачи .................................................................159
Связанные задачи ....................................................................................................160
Пример: обеспечение надёжности данных с помощью
SharedPreferences .............................................................................................160
Объединение задач в цепочку .............................................................................163
Пример: сетевые вызовы в цепочке задач ...............................................163
Вставка задач по условию .....................................................................................166
Резюме .................................................................................................................................167
Глава.9..Управление.выполнением.потока.средствами..
фреймворка.Executor...............................................168
Executor ...............................................................................................................................169
Пулы потоков ....................................................................................................................171
Предопределённые пулы потоков ......................................................................172
Пулы потоков, определяемые разработчиком ...............................................173
Конфигурация ThreadPoolExecutor .........................................................173
Проектирование пула потоков ............................................................................175
Определение размера .....................................................................................175
Динамические потоки в пуле ......................................................................177
Ограниченная или неограниченная очередь задач ..............................177
Конфигурация потока ....................................................................................178
Расширение возможностей ThreadPoolExecutor .................................179
Жизненный цикл .....................................................................................................180
Корректное завершение работы пула потоков ..............................................181
Варианты использования пула потоков и возникающие
при этом сложности ................................................................................................183
Предпочтение отдаётся созданию потока, а не организации
очереди ................................................................................................................183
Стр.10
10 Содержание
Обработка предварительно подготовленных очередей задач ..........183
Опасная ситуация при нулевом количестве базовых потоков
в пуле ...................................................................................................................184
Управление задачами ......................................................................................................184
Представление задачи ............................................................................................185
Добавление задач .....................................................................................................186
Заявление отдельной задачи .......................................................................187
Метод invokeAll ................................................................................................188
Метод InvokeAny .............................................................................................190
Отвергнутые задачи ................................................................................................191
ExecutorCompletionService ...........................................................................................191
Резюме .................................................................................................................................194
Глава.10..Связывание.фоновой.задачи.с.UI-потоком..
с.помощью.AsyncTask...............................................196
Основы использования класса AsyncTask ...............................................................196
Создание и начало работы ....................................................................................199
Отмена .........................................................................................................................200
Состояния ...................................................................................................................202
Пример: ограничение режима выполнения AsyncTask только
одной задачей в любой момент времени .................................................203
Реализация AsyncTask ....................................................................................................203
Пример: загрузка изображений ..........................................................................204
Выполнение задачи в фоновом режиме ...................................................................207
Глобальная среда выполнения в приложении ...............................................209
Выполнение в разных версиях платформы ....................................................211
Настраиваемое выполнение .................................................................................213
Пример: неглобальное последовательное выполнение ......................213
Альтернативы AsyncTask ...............................................................................................214
Случаи излишне упрощённой реализации AsyncTask................................215
Фоновые задачи, для которых требуется объект Looper ...........................216
Локальная служба ...................................................................................................216
Использование метода execute(Runnable) ......................................................216
Резюме .................................................................................................................................217
Глава.11..Службы....................................................218
Причины использования служб для асинхронного выполнения ...................218
Локальные, удалённые и глобальные службы .......................................................220
Создание и выполнение .................................................................................................222
Жизненный цикл .............................................................................................................223
Запускаемая служба ........................................................................................................226
Реализация метода onStartCommand ...............................................................226
Повторный запуск ...................................................................................................227
Служба, управляемая пользователем ...............................................................230
Стр.11
Содержание 11
Пример: соединение по протоколу Bluetooth ........................................230
Служба, управляемая задачей .............................................................................234
Пример: параллельная загрузка .................................................................234
Подключаемая служба ...................................................................................................237
Локальное подключение .......................................................................................239
Выбор механизма асинхронного выполнения .......................................................242
Резюме .................................................................................................................................243
Глава.12..Класс.IntentService.....................................244
Основы использования IntentService .......................................................................244
Эффективные способы использования IntentService .........................................246
Задачи, выполнение которых должно быть последовательным .............246
Пример: взаимодействие с веб-службой .................................................246
Асинхронное выполнение в BroadcastReceiver .............................................249
Пример: периодически выполняемые длительные операции..........250
Сравнение IntentService и Service ..............................................................................252
Резюме .................................................................................................................................253
Глава.13..Доступ.к.провайдерам.контента.с.помощью.
AsyncQueryHandler...................................................254
Краткий обзор основ использования провайдеров контента ...........................254
Настройка ContentProvider для обработки в фоновом режиме ......................256
Использование AsyncQueryHandler..........................................................................258
Пример: список контактов с раскрывающимися элементами .................260
Как работает AsyncQueryHandler ......................................................................263
Ограничения ..............................................................................................................264
Резюме .................................................................................................................................265
Глава.14..Автоматическое.выполнение.в.фоновом..
режиме.с.помощью.загрузчиков.Loader.......................266
Фреймворк Loader ...........................................................................................................268
Класс LoaderManager .............................................................................................268
Сравнение методов initLoader() и restartLoader()...............................270
Интерфейс LoaderCallbacks .................................................................................272
Класс AsyncTaskLoader ..........................................................................................274
Надёжная загрузка данных с помощью CursorLoader ........................................275
Использование CursorLoader ..............................................................................275
Пример: список контактов ....................................................................................276
Добавление поддержки CRUD ...........................................................................277
Пример: использование CursorLoader вместе с обработчиком
AsyncQueryHandler .........................................................................................278
Реализация специализированных загрузчиков .....................................................281
Жизненный цикл загрузчика ..............................................................................282
Фоновый режим загрузки .....................................................................................283
Стр.12
12 Содержание
Пример: простой специализированный загрузчик ..............................284
Управление контентом ...........................................................................................286
Доставка кэшированных результатов ...............................................................287
Пример: специализированный загрузчик файлов .......................................288
Работа с несколькими загрузчиками ................................................................291
Резюме .................................................................................................................................292
Глава.15..Подведение.итогов:.выбор.механизма..
асинхронного.выполнения. .......................................294
Сохраняйте простоту ......................................................................................................295
Управление потоками и ресурсами ............................................................................296
Организация обмена сообщениями для улучшения отзывчивости ...............297
Как избежать неожиданного и нежелательного завершения задачи .............298
Простой доступ к провайдерам контента ................................................................299
Список.литературы..................................................301
Предметный.указатель.............................................304
Стр.13