name="AppTheme"
parent="
Theme.AppCompat.Light.DarkActionBar
">
name="colorPrimary">@color/colorPrimary
name="colorPrimaryDark">@color/colorPrimaryDark
name="colorAccent">@color/colorAccent
name="AppTheme"
parent="Theme.AppCompat.Light.DarkActionBar">
name="StrongBeatBoxButton"
parent="@style/BeatBoxButton">
- bold
name="AppTheme"
parent="Theme.AppCompat.Light.DarkActionBar">
...
name="AppTheme"
parent="Theme.AppCompat
.Light.DarkActionBar
">
...
name="AppTheme"
parent="Theme.AppCompat">
name="colorPrimary">@color/
colorPrimaryred<
/item>
name="colorPrimaryDark">@color/
colorPrimary
Darkdark_red
name="colorAccent">@color/
colorAccentgray
item>
name="Theme.AppCompat"
parent="Base.Theme.AppCompat" />
Тема
Theme.AppCompat
наследует
атрибуты
от
Base.Theme.AppCompat
. Интересно, что
Theme.AppCompat
не
переопределяет никакие атрибуты, а только содержит ссылку
на своего родителя.
Щелкните мышью по
Base.Theme.AppCompat
с нажатой
клавишей (
Ctrl
). Android Studio сообщит, что тема уточняется
по ресурсам. Существует несколько разных версий этой темы в
зависимости от используемой версии Android.
name="Base.Theme.AppCompat"
parent="Base.V7.Theme.AppCompat">
name="Base.V7.Theme.AppCompat"
parent="Platform.AppCompat">
-
androidx.appcompat.app.AppCompatVie
wInflater
- false
- true
name="windowActionBarOverlay">false
name="Platform.AppCompat"
parent="android:Theme.Holo">
name="android:windowNoTitle">true
name="android:windowActionBar">false
- ?
attr/buttonBarStyle
- ?
attr/buttonBarButtonStyle
name="android:borderlessButtonStyle">?
attr/borderlessButtonStyle
...
name="Platform.AppCompat"
parent="android:Theme.Holo">
...
...
name="android:windowBackground">@color/backgrou
nd_material_dark
name="AppTheme"
parent="Theme.AppCompat">
- @color/red
name="colorPrimaryDark">@color/dark_red
- @color/gray
-
name="android:windowBackground">@color/soothing
_blue
name="Base.V7.Theme.AppCompat"
parent="Platform.AppCompat">
...
name="buttonStyle">@style/Widget.AppCompat.Butt
on
name="buttonStyleSmall">@style/Widget.AppCompat
.Button.Small
...
name="Widget.AppCompat.Button"
parent="Base.Widget.AppCompat.Button"/>
Стиль
Widget.AppCompat.Button
самостоятельно никакие
атрибуты не определяет. Чтобы просмотреть его содержимое,
перейдите к его родителю. Вы увидите, что базовый стиль
существует
в
двух
версиях.
Выберите
версию
values/values.xml
.
name="Base.Widget.AppCompat.Button"
parent="android:Widget">
name="android:background">@drawable/abc_btn_def
ault_mtrl_shape
- ?
android:attr/textAppearanceButton
- 48dip
- 88dip
- true
- true
name="android:gravity">center_vertical|center_h
orizontal
name="AppTheme"
parent="Theme.AppCompat">
name="colorPrimary">@color/red
name="AppTheme"
parent="Theme.AppCompat">
name="colorPrimary">@color/red
name="colorPrimaryDark">@color/dark_red
name="colorAccent">@color/gray
name="android:windowBackground">@color/soothing
_blue
name="BeatBoxButton"
parent="Widget.AppCompat.Button">
name="android:background">@color/dark_bluem>
name="Platform.AppCompat"
parent="android:Theme.Holo">
...
name="AppTheme"
parent="Theme.AppCompat">
...
name="BeatBoxButton"
parent="Widget.AppCompat.Button">
name="AppTheme"
parent="Theme.AppCompat">
...
name="BeatBoxButton"
parent="Widget.AppCompat.Button">
name="android:background">@drawable/button_beat
_box_normal
-
name="android:background">@drawable/button_beat
_box
Планирование работы
Чтобы запланировать выполнение
Worker
, нам нужен запрос
WorkRequest
. Сам класс
WorkRequest
является абстрактным,
поэтому нам придется использовать один из его подклассов в
зависимости от типа работы, которую вам нужно выполнить.
Если у вас есть что-то, что нужно выполнить только один раз,
используйте
OneTimeWorkRequest
. Если ваша работа должна
выполняться
периодически,
используйте
PeriodicWorkRequest
.
Пока что мы будем использовать
OneTimeWorkRequest
. Это
позволит вам убедиться, что ваш
PollWorker
работает
правильно, а также узнать больше о создании и контроле
запросов. Позже мы обновим приложение для использования
PeriodicWorkRequest
.
Откройте файл
PhotoGalleryFragment.kt
, чтобы создать
рабочий запрос и запланировать его выполнение.
Листинг 27.3. Планирование WorkRequest
(PhotoGalleryFragment.kt)
class PhotoGalleryFragment : Fragment() {
...
override fun onCreate(savedInstanceState:
Bundle?) {
...
lifecycle.addObserver(thumbnailDownload
er.fragmentLifecycleObserver)
val workRequest = OneTimeWorkRequest
.Builder(PollWorker::class.java)
.build()
WorkManager.getInstance()
.enqueue(workRequest)
}
...
}
В
OneTimeWorkRequest
используется конструктор для
создания экземпляра. Мы передаем класс
Worker
конструктору,
который будет запущен в рабочем запросе. Как только ваш
рабочий запрос будет готов, вам нужно запланировать его с
помощью класса
WorkManager
. Мы вызываем функцию
getInstance()
для доступа к
WorkManager
, затем функцию
enqueue(...)
с рабочим запросом в качестве параметра. Это
запланирует выполнение вашего рабочего запроса с учетом
типа запроса и любых ограничений, которые вы в него
добавляете.
Запустите ваше приложение и выполните поиск по запросу
PollWorker
на панели
Logcat
. После запуска вы увидите
сообщение в журнале (рис. 27.1).
Часто запланированная работа, которую вы хотите
выполнить в фоновом режиме, связана с сетью. Например, вы
запрашиваете новую информацию, которую пользователь еще
не видел, или загружаете обновления с локальной базы данных,
чтобы сохранить их на удаленном сервере. Даже если задача
важная, вам следует убедиться, что вы не используете лишний
трафик. Лучшее всего выполнять эти запросы тогда, когда
устройство подключено к сети без измерения трафика.
Рис. 27.1. Содержимое журнала
Вы можете использовать класс
Constraints
, чтобы
добавить эту информацию в ваши рабочие запросы. С помощью
этого класса вы можете требовать выполнения определенных
условий перед выполнением задачи. Одним из таких условий
может быть требование определенного типа сети. Может также
требоваться достаточное количество заряда аккумулятора или
установка устройства на зарядку.
Отредактируйте
код
OneTimeWorkRequest
в
PhotoGalleryFragment
, добавив в запрос ограничения.
Do'stlaringiz bilan baham: |