Android KTX Часть Android Jetpack .
Android KTX — это набор расширений Kotlin, входящих в состав Android Jetpack и других библиотек Android. Расширения KTX предоставляют краткий, идиоматический Kotlin для Jetpack, платформы Android и других API. Для этого эти расширения используют несколько функций языка Kotlin, в том числе следующие:
- Функции расширения
- Свойства расширения
- Лямбды
- Именованные параметры
- Значения параметров по умолчанию
- Сопрограммы
Например, при работе с SharedPreferences
вам необходимо создать редактор , прежде чем вы сможете вносить изменения в данные настроек. Вы также должны применить или зафиксировать эти изменения после завершения редактирования, как показано в следующем примере:
sharedPreferences
.edit() // create an Editor
.putBoolean("key", value)
.apply() // write to disk asynchronously
Лямбды Kotlin идеально подходят для этого варианта использования. Они позволяют использовать более лаконичный подход, передавая блок кода для выполнения после создания редактора, позволяя коду выполняться, а затем позволяя API SharedPreferences
применять изменения атомарно.
Вот пример одной из функций Android KTX Core, SharedPreferences.edit
, которая добавляет функцию редактирования в SharedPreferences
. Эта функция принимает необязательный boolean
флаг в качестве первого аргумента, который указывает, следует ли зафиксировать или применить изменения. Он также получает действие для выполнения в редакторе SharedPreferences
в форме лямбды.
// SharedPreferences.edit extension function signature from Android KTX - Core
// inline fun SharedPreferences.edit(
// commit: Boolean = false,
// action: SharedPreferences.Editor.() -> Unit)
// Commit a new value asynchronously
sharedPreferences.edit { putBoolean("key", value) }
// Commit a new value synchronously
sharedPreferences.edit(commit = true) { putBoolean("key", value) }
Вызывающий может выбрать, зафиксировать или применить изменения. Лямбда- action
само по себе является анонимной функцией расширения SharedPreferences.Editor
, которая возвращает Unit
, как указано в его сигнатуре. Вот почему внутри блока вы можете выполнять работу непосредственно над SharedPreferences.Editor
.
Наконец, подпись SharedPreferences.edit()
содержит ключевое слово inline
. Это ключевое слово сообщает компилятору Kotlin, что он должен копировать и вставлять (или вставлять ) скомпилированный байт-код для функции каждый раз, когда функция используется. Это позволяет избежать накладных расходов на создание экземпляра нового класса для каждого action
при каждом вызове этой функции.
Этот шаблон передачи кода с использованием лямбда-выражений, применения разумных значений по умолчанию, которые можно переопределить, и добавления такого поведения к существующим API с использованием inline
функций расширения является типичным для улучшений, предоставляемых библиотекой Android KTX.
Используйте Android KTX в своем проекте
Чтобы начать использовать Android KTX, добавьте следующую зависимость в файл build.gradle
вашего проекта:
классный
repositories { google() }
Котлин
repositories { google() }
Модули AndroidX
Android KTX организован в виде модулей, каждый из которых содержит один или несколько пакетов.
Вы должны включить зависимость для каждого артефакта модуля в файл build.gradle
вашего приложения. Не забудьте добавить номер версии к артефакту. Номера последних версий можно найти в соответствующем разделе каждого артефакта в этой теме.
Android KTX содержит один основной модуль , который предоставляет расширения Kotlin для общих API-интерфейсов платформы, а также несколько расширений для конкретной предметной области.
За исключением основного модуля, все артефакты модуля KTX заменяют базовую зависимость Java в вашем файле build.gradle
. Например, вы можете заменить зависимость androidx.fragment:fragment
на androidx.fragment:fragment-ktx
. Этот синтаксис помогает лучше управлять версиями и не добавляет дополнительных требований к объявлению зависимостей.
Ядро КТХ
Модуль Core KTX предоставляет расширения для распространенных библиотек, которые являются частью платформы Android. Эти библиотеки не имеют зависимостей на основе Java, которые необходимо добавить в build.gradle
.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.core:core-ktx:1.13.1" }
Kotlin
dependencies { implementation("androidx.core:core-ktx:1.13.1") }
Вот список пакетов, содержащихся в модуле Core KTX:
- androidx.core.animation
- androidx.core.content
- androidx.core.content.res
- androidx.core.database
- androidx.core.database.sqlite
- androidx.core.graphics
- androidx.core.graphics.drawable
- androidx.core.location
- androidx.core.net
- androidx.core.os
- androidx.core.text
- androidx.core.transition
- androidx.core.util
- androidx.core.view
- androidx.core.widget
Коллекция КТХ
Расширения Collection содержат служебные функции для работы с библиотеками коллекций Android, эффективно использующими память, включая ArrayMap
, LongSparseArray
, LruCache
и другие.
Чтобы использовать этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.collection:collection-ktx:1.4.4" }
Kotlin
dependencies { implementation("androidx.collection:collection-ktx:1.4.4") }
Расширения коллекций используют преимущества перегрузки операторов Kotlin для упрощения таких вещей, как объединение коллекций, как показано в следующем примере:
// Combine 2 ArraySets into 1.
val combinedArraySet = arraySetOf(1, 2, 3) + arraySetOf(4, 5, 6)
// Combine with numbers to create a new sets.
val newArraySet = combinedArraySet + 7 + 8
Фрагмент КТХ
Модуль Fragment KTX предоставляет ряд расширений для упрощения API фрагмента.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.fragment:fragment-ktx:1.8.4" }
Kotlin
dependencies { implementation("androidx.fragment:fragment-ktx:1.8.4") }
С помощью модуля Fragment KTX вы можете упростить транзакции фрагментов с помощью лямбда-выражений, например:
fragmentManager().commit {
addToBackStack("...")
setCustomAnimations(
R.anim.enter_anim,
R.anim.exit_anim)
add(fragment, "...")
}
Вы также можете выполнить привязку к ViewModel
в одной строке, используя делегаты свойств viewModels
и activityViewModels
:
// Get a reference to the ViewModel scoped to this Fragment
val viewModel by viewModels<MyViewModel>()
// Get a reference to the ViewModel scoped to its Activity
val viewModel by activityViewModels<MyViewModel>()
Жизненный цикл КТХ
Lifecycle KTX определяет LifecycleScope
для каждого объекта Lifecycle
. Любая сопрограмма, запущенная в этой области, отменяется при уничтожении Lifecycle
. Вы можете получить доступ к CoroutineScope
Lifecycle
, используя свойства lifecycle.coroutineScope
или lifecycleOwner.lifecycleScope
.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.6" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.6") }
В следующем примере показано, как использовать lifecycleOwner.lifecycleScope
для асинхронного создания предварительно вычисленного текста:
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
val params = TextViewCompat.getTextMetricsParams(textView)
val precomputedText = withContext(Dispatchers.Default) {
PrecomputedTextCompat.create(longTextContent, params)
}
TextViewCompat.setPrecomputedText(textView, precomputedText)
}
}
}
LiveData КТХ
При использовании LiveData вам может потребоваться асинхронное вычисление значений. Например, вы можете захотеть получить настройки пользователя и передать их в свой пользовательский интерфейс. Для этих случаев LiveData KTX предоставляет функцию построения liveData
, которая вызывает функцию suspend
и обрабатывает результат как объект LiveData
.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.8.6" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.6") }
В следующем примере loadUser()
— это функция приостановки, объявленная в другом месте. Вы можете использовать функцию компоновщика liveData
для асинхронного вызова loadUser()
, а затем использовать emit()
для выдачи результата:
val user: LiveData<User> = liveData {
val data = database.loadUser() // loadUser is a suspend function.
emit(data)
}
Дополнительную информацию об использовании сопрограмм с LiveData
см. в разделе Использование сопрограмм Kotlin с компонентами архитектуры .
Навигация КТХ
Каждый компонент библиотеки навигации имеет свою собственную версию KTX, которая адаптирует API, чтобы сделать его более кратким и идиоматическим Kotlin.
Чтобы включить эти модули, добавьте следующее в файл build.gradle
вашего приложения:
классный
dependencies { implementation "androidx.navigation:navigation-runtime-ktx:2.8.1" implementation "androidx.navigation:navigation-fragment-ktx:2.8.1" implementation "androidx.navigation:navigation-ui-ktx:2.8.1" }
Котлин
dependencies { implementation("androidx.navigation:navigation-runtime-ktx:2.8.1") implementation("androidx.navigation:navigation-fragment-ktx:2.8.1") implementation("androidx.navigation:navigation-ui-ktx:2.8.1") }
Используйте функции расширения и делегирование свойств для доступа к аргументам назначения и перехода к местам назначения, как показано в следующем примере:
class MyDestination : Fragment() {
// Type-safe arguments are accessed from the bundle.
val args by navArgs<MyDestinationArgs>()
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
view.findViewById<Button>(R.id.next)
.setOnClickListener {
// Fragment extension added to retrieve a NavController from
// any destination.
findNavController().navigate(R.id.action_to_next_destination)
}
}
...
}
Палитра КТХ
Модуль Palette KTX предлагает идиоматическую поддержку Kotlin для работы с цветовыми палитрами.
Чтобы использовать этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.palette:palette-ktx:1.0.0" }
Kotlin
dependencies { implementation("androidx.palette:palette-ktx:1.0.0") }
Например, при работе с экземпляром Palette
вы можете получить selected
образец для заданной target
с помощью оператора get ( [ ]
):
val palette = Palette.from(bitmap).generate()
val swatch = palette[target]
Реактивные потоки KTX
Модуль Reactive Streams KTX позволяет создавать наблюдаемый поток LiveData
от издателя ReactiveStreams
.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.6" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.6") }
В качестве примера предположим, что база данных имеет небольшой список пользователей. В своем приложении вы загружаете базу данных в память, а затем отображаете пользовательские данные в своем пользовательском интерфейсе. Для этого вы можете использовать RxJava . Компонент Room
Jetpack может получить список пользователей в виде Flowable
. В этом сценарии вам также необходимо управлять подпиской издателя Rx на протяжении всего срока действия вашего фрагмента или действия.
Однако с LiveDataReactiveStreams
вы можете воспользоваться преимуществами RxJava и его богатым набором операторов и возможностей планирования работы, одновременно работая с простотой LiveData
, как показано в следующем примере:
val fun getUsersLiveData() : LiveData<List<User>> {
val users: Flowable<List<User>> = dao.findUsers()
return LiveDataReactiveStreams.fromPublisher(users)
}
Комната КТХ
Расширения комнат добавляют поддержку сопрограмм для транзакций базы данных.
Чтобы использовать этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.room:room-ktx:2.6.1" }
Kotlin
dependencies { implementation("androidx.room:room-ktx:2.6.1") }
Вот несколько примеров, когда Room теперь использует сопрограммы. В первом примере используется функция suspend
для возврата списка объектов User
, а во втором — Flow
Kotlin для асинхронного возврата списка User
. Обратите внимание, что при использовании Flow
вы также получаете уведомления о любых изменениях в запрашиваемых таблицах.
@Query("SELECT * FROM Users")
suspend fun getUsers(): List<User>
@Query("SELECT * FROM Users")
fun getUsers(): Flow<List<User>>
SQLite KTX
Расширения SQLite заключают код, связанный с SQL, в транзакции, устраняя большое количество шаблонного кода.
Чтобы использовать этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.sqlite:sqlite-ktx:2.4.0" }
Kotlin
dependencies { implementation("androidx.sqlite:sqlite-ktx:2.4.0") }
Вот пример использования расширения transaction
для выполнения транзакции базы данных:
db.transaction {
// insert data
}
Просмотр модели KTX
Библиотека ViewModel KTX предоставляет функцию viewModelScope()
, которая упрощает запуск сопрограмм из вашей ViewModel
. CoroutineScope
привязан к Dispatchers.Main
и автоматически отменяется при очистке ViewModel
. Вы можете использовать viewModelScope()
вместо создания новой области для каждой ViewModel
.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
классный
dependencies { implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6" }
Котлин
dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6") }
Например, следующая функция viewModelScope()
запускает сопрограмму, которая выполняет сетевой запрос в фоновом потоке. Библиотека выполняет всю настройку и очистку соответствующей области:
class MainViewModel : ViewModel() {
// Make a network request without blocking the UI thread
private fun makeNetworkRequest() {
// launch a coroutine in viewModelScope
viewModelScope.launch {
remoteApi.slowFetch()
...
}
}
// No need to override onCleared()
}
Менеджер работ КТХ
WorkManager KTX обеспечивает первоклассную поддержку сопрограмм.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
классный
dependencies { implementation "androidx.work:work-runtime-ktx:2.9.1" }
Котлин
dependencies { implementation("androidx.work:work-runtime-ktx:2.9.1") }
Вместо расширения Worker
теперь вы можете расширить CoroutineWorker
, у которого немного другой API. Например, если вы хотите создать простой CoroutineWorker
для выполнения некоторых сетевых операций, вы можете сделать следующее:
class CoroutineDownloadWorker(context: Context, params: WorkerParameters)
: CoroutineWorker(context, params) {
override suspend fun doWork(): Result = coroutineScope {
val jobs = (0 until 100).map {
async {
downloadSynchronously("https://www.google.com")
}
}
// awaitAll will throw an exception if a download fails, which
// CoroutineWorker will treat as a failure
jobs.awaitAll()
Result.success()
}
}
Дополнительные сведения об использовании CoroutineWorker
см. в разделе Потоки в CoroutineWorker .
WorkManager KTX также добавляет функции расширения в Operations
и ListenableFutures
для приостановки текущей сопрограммы.
Вот пример, который приостанавливает Operation
, возвращаемую функцией enqueue()
:
// Inside of a coroutine...
// Run async operation and suspend until completed.
WorkManager.getInstance()
.beginWith(longWorkRequest)
.enqueue().await()
// Resume after work completes...
Другие модули KTX
Вы также можете включить дополнительные модули KTX, существующие за пределами AndroidX.
Огневая база КТХ
Некоторые SDK Firebase для Android содержат библиотеки расширений Kotlin, которые позволяют вам писать идиоматический код Kotlin при использовании Firebase в вашем приложении. Для получения дополнительной информации см. следующие темы:
Платформа Google Карт KTX
Для Android SDK платформы Google Maps доступны расширения KTX, которые позволяют вам использовать преимущества некоторых функций языка Kotlin, таких как функции расширения, именованные параметры и аргументы по умолчанию, объявления деструктуризации и сопрограммы. Для получения дополнительной информации см. следующие темы:
Играть в ядро KTX
В Play Core KTX добавлена поддержка сопрограмм Kotlin для одноразовых запросов и Flow для мониторинга обновлений статуса путем добавления функций расширения к SplitInstallManager
и AppUpdateManager
в библиотеке Play Core.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "com.google.android.play:core-ktx:1.8.1" }
Kotlin
dependencies { implementation("com.google.android.play:core-ktx:1.8.1") }
Вот пример Flow
мониторинга состояния:
// Inside of a coroutine...
// Request in-app update status updates.
manager.requestUpdateFlow().collect { updateResult ->
when (updateResult) {
is AppUpdateResult.Available -> TODO()
is AppUpdateResult.InProgress -> TODO()
is AppUpdateResult.Downloaded -> TODO()
AppUpdateResult.NotAvailable -> TODO()
}
}
Дополнительная информация
Чтобы узнать больше об Android KTX, посмотрите видео DevBytes .
Чтобы сообщить о проблеме или предложить функцию, используйте систему отслеживания проблем Android KTX .
,Android KTX Часть Android Jetpack .
Android KTX — это набор расширений Kotlin, входящих в состав Android Jetpack и других библиотек Android. Расширения KTX предоставляют краткий, идиоматический Kotlin для Jetpack, платформы Android и других API. Для этого эти расширения используют несколько функций языка Kotlin, в том числе следующие:
- Функции расширения
- Свойства расширения
- Лямбды
- Именованные параметры
- Значения параметров по умолчанию
- Сопрограммы
Например, при работе с SharedPreferences
вам необходимо создать редактор , прежде чем вы сможете вносить изменения в данные настроек. Вы также должны применить или зафиксировать эти изменения после завершения редактирования, как показано в следующем примере:
sharedPreferences
.edit() // create an Editor
.putBoolean("key", value)
.apply() // write to disk asynchronously
Лямбды Kotlin идеально подходят для этого варианта использования. Они позволяют использовать более лаконичный подход, передавая блок кода для выполнения после создания редактора, позволяя коду выполняться, а затем позволяя API SharedPreferences
применять изменения атомарно.
Вот пример одной из функций Android KTX Core, SharedPreferences.edit
, которая добавляет функцию редактирования в SharedPreferences
. Эта функция принимает необязательный boolean
флаг в качестве первого аргумента, который указывает, следует ли зафиксировать или применить изменения. Он также получает действие для выполнения в редакторе SharedPreferences
в форме лямбды.
// SharedPreferences.edit extension function signature from Android KTX - Core
// inline fun SharedPreferences.edit(
// commit: Boolean = false,
// action: SharedPreferences.Editor.() -> Unit)
// Commit a new value asynchronously
sharedPreferences.edit { putBoolean("key", value) }
// Commit a new value synchronously
sharedPreferences.edit(commit = true) { putBoolean("key", value) }
Вызывающий может выбрать, зафиксировать или применить изменения. Лямбда- action
само по себе является анонимной функцией расширения SharedPreferences.Editor
, которая возвращает Unit
, как указано в его сигнатуре. Вот почему внутри блока вы можете выполнять работу непосредственно над SharedPreferences.Editor
.
Наконец, подпись SharedPreferences.edit()
содержит ключевое слово inline
. Это ключевое слово сообщает компилятору Kotlin, что он должен копировать и вставлять (или вставлять ) скомпилированный байт-код для функции каждый раз, когда функция используется. Это позволяет избежать накладных расходов на создание экземпляра нового класса для каждого action
при каждом вызове этой функции.
Этот шаблон передачи кода с использованием лямбда-выражений, применения разумных значений по умолчанию, которые можно переопределить, и добавления этого поведения к существующим API с использованием inline
функций расширения является типичным для улучшений, предоставляемых библиотекой Android KTX.
Используйте Android KTX в своем проекте
Чтобы начать использовать Android KTX, добавьте следующую зависимость в файл build.gradle
вашего проекта:
классный
repositories { google() }
Котлин
repositories { google() }
Модули AndroidX
Android KTX организован в модули, каждый из которых содержит один или несколько пакетов.
Вы должны включить зависимость для каждого артефакта модуля в файл build.gradle
вашего приложения. Не забудьте добавить номер версии к артефакту. Номера последних версий можно найти в соответствующем разделе каждого артефакта в этой теме.
Android KTX содержит один основной модуль , который предоставляет расширения Kotlin для общих API-интерфейсов платформы, а также несколько расширений для конкретной предметной области.
За исключением основного модуля, все артефакты модуля KTX заменяют базовую зависимость Java в вашем файле build.gradle
. Например, вы можете заменить зависимость androidx.fragment:fragment
на androidx.fragment:fragment-ktx
. Этот синтаксис помогает лучше управлять версиями и не добавляет дополнительных требований к объявлению зависимостей.
Ядро КТХ
Модуль Core KTX предоставляет расширения для распространенных библиотек, которые являются частью платформы Android. Эти библиотеки не имеют зависимостей на основе Java, которые необходимо добавить в build.gradle
.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.core:core-ktx:1.13.1" }
Kotlin
dependencies { implementation("androidx.core:core-ktx:1.13.1") }
Вот список пакетов, содержащихся в модуле Core KTX:
- androidx.core.animation
- androidx.core.content
- androidx.core.content.res
- androidx.core.database
- androidx.core.database.sqlite
- androidx.core.graphics
- androidx.core.graphics.drawable
- androidx.core.location
- androidx.core.net
- androidx.core.os
- androidx.core.text
- androidx.core.transition
- androidx.core.util
- androidx.core.view
- androidx.core.widget
Коллекция КТХ
Расширения Collection содержат служебные функции для работы с библиотеками коллекций Android, эффективно использующими память, включая ArrayMap
, LongSparseArray
, LruCache
и другие.
Чтобы использовать этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.collection:collection-ktx:1.4.4" }
Kotlin
dependencies { implementation("androidx.collection:collection-ktx:1.4.4") }
Расширения коллекций используют преимущества перегрузки операторов Kotlin для упрощения таких вещей, как объединение коллекций, как показано в следующем примере:
// Combine 2 ArraySets into 1.
val combinedArraySet = arraySetOf(1, 2, 3) + arraySetOf(4, 5, 6)
// Combine with numbers to create a new sets.
val newArraySet = combinedArraySet + 7 + 8
Фрагмент КТХ
Модуль Fragment KTX предоставляет ряд расширений для упрощения API фрагмента.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.fragment:fragment-ktx:1.8.4" }
Kotlin
dependencies { implementation("androidx.fragment:fragment-ktx:1.8.4") }
С помощью модуля Fragment KTX вы можете упростить транзакции фрагментов с помощью лямбда-выражений, например:
fragmentManager().commit {
addToBackStack("...")
setCustomAnimations(
R.anim.enter_anim,
R.anim.exit_anim)
add(fragment, "...")
}
Вы также можете выполнить привязку к ViewModel
в одной строке, используя делегаты свойств viewModels
и activityViewModels
:
// Get a reference to the ViewModel scoped to this Fragment
val viewModel by viewModels<MyViewModel>()
// Get a reference to the ViewModel scoped to its Activity
val viewModel by activityViewModels<MyViewModel>()
Жизненный цикл КТХ
Lifecycle KTX определяет LifecycleScope
для каждого объекта Lifecycle
. Любая сопрограмма, запущенная в этой области, отменяется при уничтожении Lifecycle
. Вы можете получить доступ к CoroutineScope
Lifecycle
, используя свойства lifecycle.coroutineScope
или lifecycleOwner.lifecycleScope
.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.6" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.6") }
В следующем примере показано, как использовать lifecycleOwner.lifecycleScope
для асинхронного создания предварительно вычисленного текста:
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
val params = TextViewCompat.getTextMetricsParams(textView)
val precomputedText = withContext(Dispatchers.Default) {
PrecomputedTextCompat.create(longTextContent, params)
}
TextViewCompat.setPrecomputedText(textView, precomputedText)
}
}
}
LiveData КТХ
При использовании LiveData вам может потребоваться асинхронное вычисление значений. Например, вы можете захотеть получить настройки пользователя и передать их в свой пользовательский интерфейс. Для этих случаев LiveData KTX предоставляет функцию построения liveData
, которая вызывает функцию suspend
и обрабатывает результат как объект LiveData
.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.8.6" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.6") }
В следующем примере loadUser()
— это функция приостановки, объявленная в другом месте. Вы можете использовать функцию компоновщика liveData
для асинхронного вызова loadUser()
, а затем использовать emit()
для выдачи результата:
val user: LiveData<User> = liveData {
val data = database.loadUser() // loadUser is a suspend function.
emit(data)
}
Дополнительную информацию об использовании сопрограмм с LiveData
см. в разделе Использование сопрограмм Kotlin с компонентами архитектуры .
Навигация КТХ
Каждый компонент библиотеки навигации имеет свою собственную версию KTX, которая адаптирует API, чтобы сделать его более кратким и идиоматическим Kotlin.
Чтобы включить эти модули, добавьте следующее в файл build.gradle
вашего приложения:
классный
dependencies { implementation "androidx.navigation:navigation-runtime-ktx:2.8.1" implementation "androidx.navigation:navigation-fragment-ktx:2.8.1" implementation "androidx.navigation:navigation-ui-ktx:2.8.1" }
Котлин
dependencies { implementation("androidx.navigation:navigation-runtime-ktx:2.8.1") implementation("androidx.navigation:navigation-fragment-ktx:2.8.1") implementation("androidx.navigation:navigation-ui-ktx:2.8.1") }
Используйте функции расширения и делегирование свойств для доступа к аргументам назначения и перехода к местам назначения, как показано в следующем примере:
class MyDestination : Fragment() {
// Type-safe arguments are accessed from the bundle.
val args by navArgs<MyDestinationArgs>()
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
view.findViewById<Button>(R.id.next)
.setOnClickListener {
// Fragment extension added to retrieve a NavController from
// any destination.
findNavController().navigate(R.id.action_to_next_destination)
}
}
...
}
Палитра КТХ
Модуль Palette KTX предлагает идиоматическую поддержку Kotlin для работы с цветовыми палитрами.
Чтобы использовать этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.palette:palette-ktx:1.0.0" }
Kotlin
dependencies { implementation("androidx.palette:palette-ktx:1.0.0") }
Например, при работе с экземпляром Palette
вы можете получить selected
образец для заданной target
с помощью оператора get ( [ ]
):
val palette = Palette.from(bitmap).generate()
val swatch = palette[target]
Реактивные потоки KTX
Модуль Reactive Streams KTX позволяет создавать наблюдаемый поток LiveData
от издателя ReactiveStreams
.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.6" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.6") }
В качестве примера предположим, что база данных имеет небольшой список пользователей. В своем приложении вы загружаете базу данных в память, а затем отображаете пользовательские данные в своем пользовательском интерфейсе. Для этого вы можете использовать RxJava . Компонент Room
Jetpack может получить список пользователей в виде Flowable
. В этом сценарии вам также необходимо управлять подпиской издателя Rx на протяжении всего срока действия вашего фрагмента или действия.
Однако с помощью LiveDataReactiveStreams
вы можете воспользоваться преимуществами RxJava и его богатым набором операторов и возможностей планирования работы, одновременно работая с простотой LiveData
, как показано в следующем примере:
val fun getUsersLiveData() : LiveData<List<User>> {
val users: Flowable<List<User>> = dao.findUsers()
return LiveDataReactiveStreams.fromPublisher(users)
}
Комната КТХ
Расширения комнат добавляют поддержку сопрограмм для транзакций базы данных.
Чтобы использовать этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.room:room-ktx:2.6.1" }
Kotlin
dependencies { implementation("androidx.room:room-ktx:2.6.1") }
Вот несколько примеров, когда Room теперь использует сопрограммы. В первом примере используется функция suspend
для возврата списка объектов User
, а во втором — Flow
Kotlin для асинхронного возврата списка User
. Обратите внимание, что при использовании Flow
вы также получаете уведомления о любых изменениях в запрашиваемых таблицах.
@Query("SELECT * FROM Users")
suspend fun getUsers(): List<User>
@Query("SELECT * FROM Users")
fun getUsers(): Flow<List<User>>
SQLite KTX
Расширения SQLite заключают код, связанный с SQL, в транзакции, устраняя большое количество шаблонного кода.
Чтобы использовать этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.sqlite:sqlite-ktx:2.4.0" }
Kotlin
dependencies { implementation("androidx.sqlite:sqlite-ktx:2.4.0") }
Вот пример использования расширения transaction
для выполнения транзакции базы данных:
db.transaction {
// insert data
}
Просмотр модели KTX
Библиотека ViewModel KTX предоставляет функцию viewModelScope()
, которая упрощает запуск сопрограмм из вашей ViewModel
. CoroutineScope
привязан к Dispatchers.Main
и автоматически отменяется при очистке ViewModel
. Вы можете использовать viewModelScope()
вместо создания новой области для каждой ViewModel
.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
классный
dependencies { implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6" }
Котлин
dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6") }
Например, следующая функция viewModelScope()
запускает сопрограмму, которая выполняет сетевой запрос в фоновом потоке. Библиотека выполняет всю настройку и очистку соответствующей области:
class MainViewModel : ViewModel() {
// Make a network request without blocking the UI thread
private fun makeNetworkRequest() {
// launch a coroutine in viewModelScope
viewModelScope.launch {
remoteApi.slowFetch()
...
}
}
// No need to override onCleared()
}
Менеджер работ КТХ
WorkManager KTX обеспечивает первоклассную поддержку сопрограмм.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
классный
dependencies { implementation "androidx.work:work-runtime-ktx:2.9.1" }
Котлин
dependencies { implementation("androidx.work:work-runtime-ktx:2.9.1") }
Вместо расширения Worker
теперь вы можете расширить CoroutineWorker
, у которого немного другой API. Например, если вы хотите создать простой CoroutineWorker
для выполнения некоторых сетевых операций, вы можете сделать следующее:
class CoroutineDownloadWorker(context: Context, params: WorkerParameters)
: CoroutineWorker(context, params) {
override suspend fun doWork(): Result = coroutineScope {
val jobs = (0 until 100).map {
async {
downloadSynchronously("https://www.google.com")
}
}
// awaitAll will throw an exception if a download fails, which
// CoroutineWorker will treat as a failure
jobs.awaitAll()
Result.success()
}
}
Дополнительные сведения об использовании CoroutineWorker
см. в разделе Потоки в CoroutineWorker .
WorkManager KTX также добавляет функции расширения в Operations
и ListenableFutures
для приостановки текущей сопрограммы.
Вот пример, который приостанавливает Operation
, возвращаемую функцией enqueue()
:
// Inside of a coroutine...
// Run async operation and suspend until completed.
WorkManager.getInstance()
.beginWith(longWorkRequest)
.enqueue().await()
// Resume after work completes...
Другие модули KTX
Вы также можете включить дополнительные модули KTX, существующие за пределами AndroidX.
Огневая база КТХ
Некоторые SDK Firebase для Android содержат библиотеки расширений Kotlin, которые позволяют вам писать идиоматический код Kotlin при использовании Firebase в вашем приложении. Для получения дополнительной информации см. следующие темы:
Платформа Google Карт KTX
Для Android SDK платформы Google Maps доступны расширения KTX, которые позволяют вам использовать преимущества некоторых функций языка Kotlin, таких как функции расширения, именованные параметры и аргументы по умолчанию, объявления деструктуризации и сопрограммы. Для получения дополнительной информации см. следующие темы:
Играть в ядро KTX
В Play Core KTX добавлена поддержка сопрограмм Kotlin для одноразовых запросов и Flow для мониторинга обновлений статуса путем добавления функций расширения к SplitInstallManager
и AppUpdateManager
в библиотеке Play Core.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "com.google.android.play:core-ktx:1.8.1" }
Kotlin
dependencies { implementation("com.google.android.play:core-ktx:1.8.1") }
Вот пример Flow
мониторинга состояния:
// Inside of a coroutine...
// Request in-app update status updates.
manager.requestUpdateFlow().collect { updateResult ->
when (updateResult) {
is AppUpdateResult.Available -> TODO()
is AppUpdateResult.InProgress -> TODO()
is AppUpdateResult.Downloaded -> TODO()
AppUpdateResult.NotAvailable -> TODO()
}
}
Дополнительная информация
Чтобы узнать больше об Android KTX, посмотрите видео DevBytes .
Чтобы сообщить о проблеме или предложить функцию, используйте систему отслеживания проблем Android KTX .
,Android KTX Часть Android Jetpack .
Android KTX — это набор расширений Kotlin, входящих в состав Android Jetpack и других библиотек Android. Расширения KTX предоставляют краткий, идиоматический Kotlin для Jetpack, платформы Android и других API. Для этого эти расширения используют несколько функций языка Kotlin, в том числе следующие:
- Функции расширения
- Свойства расширения
- Лямбды
- Именованные параметры
- Значения параметров по умолчанию
- Сопрограммы
Например, при работе с SharedPreferences
вам необходимо создать редактор , прежде чем вы сможете вносить изменения в данные настроек. Вы также должны применить или зафиксировать эти изменения после завершения редактирования, как показано в следующем примере:
sharedPreferences
.edit() // create an Editor
.putBoolean("key", value)
.apply() // write to disk asynchronously
Лямбды Kotlin идеально подходят для этого варианта использования. Они позволяют использовать более лаконичный подход, передавая блок кода для выполнения после создания редактора, позволяя коду выполняться, а затем позволяя API SharedPreferences
применять изменения атомарно.
Вот пример одной из функций Android KTX Core, SharedPreferences.edit
, которая добавляет функцию редактирования в SharedPreferences
. Эта функция принимает необязательный boolean
флаг в качестве первого аргумента, который указывает, следует ли зафиксировать или применить изменения. Он также получает действие для выполнения в редакторе SharedPreferences
в форме лямбды.
// SharedPreferences.edit extension function signature from Android KTX - Core
// inline fun SharedPreferences.edit(
// commit: Boolean = false,
// action: SharedPreferences.Editor.() -> Unit)
// Commit a new value asynchronously
sharedPreferences.edit { putBoolean("key", value) }
// Commit a new value synchronously
sharedPreferences.edit(commit = true) { putBoolean("key", value) }
Вызывающий может выбрать, зафиксировать или применить изменения. Лямбда- action
само по себе является анонимной функцией расширения SharedPreferences.Editor
, которая возвращает Unit
, как указано в его сигнатуре. Вот почему внутри блока вы можете выполнять работу непосредственно над SharedPreferences.Editor
.
Наконец, подпись SharedPreferences.edit()
содержит ключевое слово inline
. Это ключевое слово сообщает компилятору Kotlin, что он должен копировать и вставлять (или вставлять ) скомпилированный байт-код для функции каждый раз, когда функция используется. Это позволяет избежать накладных расходов на создание экземпляра нового класса для каждого action
при каждом вызове этой функции.
Этот шаблон передачи кода с использованием лямбда-выражений, применения разумных значений по умолчанию, которые можно переопределить, и добавления этого поведения к существующим API с использованием inline
функций расширения является типичным для улучшений, предоставляемых библиотекой Android KTX.
Используйте Android KTX в своем проекте
Чтобы начать использовать Android KTX, добавьте следующую зависимость в файл build.gradle
вашего проекта:
классный
repositories { google() }
Котлин
repositories { google() }
Модули AndroidX
Android KTX организован в виде модулей, каждый из которых содержит один или несколько пакетов.
Вы должны включить зависимость для каждого артефакта модуля в файл build.gradle
вашего приложения. Не забудьте добавить номер версии к артефакту. Номера последних версий можно найти в соответствующем разделе каждого артефакта в этой теме.
Android KTX содержит один основной модуль , который предоставляет расширения Kotlin для общих API-интерфейсов платформы, а также несколько расширений для конкретной предметной области.
За исключением основного модуля, все артефакты модуля KTX заменяют базовую зависимость Java в вашем файле build.gradle
. Например, вы можете заменить зависимость androidx.fragment:fragment
на androidx.fragment:fragment-ktx
. Этот синтаксис помогает лучше управлять версиями и не добавляет дополнительных требований к объявлению зависимостей.
Ядро КТХ
Модуль Core KTX предоставляет расширения для распространенных библиотек, которые являются частью платформы Android. Эти библиотеки не имеют зависимостей на основе Java, которые необходимо добавить в build.gradle
.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.core:core-ktx:1.13.1" }
Kotlin
dependencies { implementation("androidx.core:core-ktx:1.13.1") }
Вот список пакетов, содержащихся в модуле Core KTX:
- androidx.core.animation
- androidx.core.content
- androidx.core.content.res
- androidx.core.database
- androidx.core.database.sqlite
- androidx.core.graphics
- androidx.core.graphics.drawable
- androidx.core.location
- androidx.core.net
- androidx.core.os
- androidx.core.text
- androidx.core.transition
- androidx.core.util
- androidx.core.view
- androidx.core.widget
Коллекция КТХ
Расширения Collection содержат служебные функции для работы с библиотеками коллекций Android, эффективно использующими память, включая ArrayMap
, LongSparseArray
, LruCache
и другие.
Чтобы использовать этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.collection:collection-ktx:1.4.4" }
Kotlin
dependencies { implementation("androidx.collection:collection-ktx:1.4.4") }
Расширения коллекций используют преимущества перегрузки операторов Kotlin для упрощения таких вещей, как объединение коллекций, как показано в следующем примере:
// Combine 2 ArraySets into 1.
val combinedArraySet = arraySetOf(1, 2, 3) + arraySetOf(4, 5, 6)
// Combine with numbers to create a new sets.
val newArraySet = combinedArraySet + 7 + 8
Фрагмент КТХ
Модуль Fragment KTX предоставляет ряд расширений для упрощения API фрагмента.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.fragment:fragment-ktx:1.8.4" }
Kotlin
dependencies { implementation("androidx.fragment:fragment-ktx:1.8.4") }
С помощью модуля Fragment KTX вы можете упростить транзакции фрагментов с помощью лямбда-выражений, например:
fragmentManager().commit {
addToBackStack("...")
setCustomAnimations(
R.anim.enter_anim,
R.anim.exit_anim)
add(fragment, "...")
}
Вы также можете выполнить привязку к ViewModel
в одной строке, используя делегаты свойств viewModels
и activityViewModels
:
// Get a reference to the ViewModel scoped to this Fragment
val viewModel by viewModels<MyViewModel>()
// Get a reference to the ViewModel scoped to its Activity
val viewModel by activityViewModels<MyViewModel>()
Жизненный цикл КТХ
Lifecycle KTX определяет LifecycleScope
для каждого объекта Lifecycle
. Любая сопрограмма, запущенная в этой области, отменяется при уничтожении Lifecycle
. Вы можете получить доступ к CoroutineScope
Lifecycle
, используя свойства lifecycle.coroutineScope
или lifecycleOwner.lifecycleScope
.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.6" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.6") }
В следующем примере показано, как использовать lifecycleOwner.lifecycleScope
для асинхронного создания предварительно вычисленного текста:
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
val params = TextViewCompat.getTextMetricsParams(textView)
val precomputedText = withContext(Dispatchers.Default) {
PrecomputedTextCompat.create(longTextContent, params)
}
TextViewCompat.setPrecomputedText(textView, precomputedText)
}
}
}
LiveData КТХ
При использовании LiveData вам может потребоваться асинхронное вычисление значений. Например, вы можете захотеть получить настройки пользователя и передать их в свой пользовательский интерфейс. Для этих случаев LiveData KTX предоставляет функцию построения liveData
, которая вызывает функцию suspend
и обрабатывает результат как объект LiveData
.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.8.6" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.6") }
В следующем примере loadUser()
— это функция приостановки, объявленная в другом месте. Вы можете использовать функцию компоновщика liveData
для асинхронного вызова loadUser()
, а затем использовать emit()
для выдачи результата:
val user: LiveData<User> = liveData {
val data = database.loadUser() // loadUser is a suspend function.
emit(data)
}
Дополнительную информацию об использовании сопрограмм с LiveData
см. в разделе Использование сопрограмм Kotlin с компонентами архитектуры .
Навигация КТХ
Каждый компонент библиотеки навигации имеет свою собственную версию KTX, которая адаптирует API, чтобы сделать его более кратким и идиоматическим Kotlin.
Чтобы включить эти модули, добавьте следующее в файл build.gradle
вашего приложения:
классный
dependencies { implementation "androidx.navigation:navigation-runtime-ktx:2.8.1" implementation "androidx.navigation:navigation-fragment-ktx:2.8.1" implementation "androidx.navigation:navigation-ui-ktx:2.8.1" }
Котлин
dependencies { implementation("androidx.navigation:navigation-runtime-ktx:2.8.1") implementation("androidx.navigation:navigation-fragment-ktx:2.8.1") implementation("androidx.navigation:navigation-ui-ktx:2.8.1") }
Используйте функции расширения и делегирование свойств для доступа к аргументам назначения и перехода к местам назначения, как показано в следующем примере:
class MyDestination : Fragment() {
// Type-safe arguments are accessed from the bundle.
val args by navArgs<MyDestinationArgs>()
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
view.findViewById<Button>(R.id.next)
.setOnClickListener {
// Fragment extension added to retrieve a NavController from
// any destination.
findNavController().navigate(R.id.action_to_next_destination)
}
}
...
}
Палитра КТХ
Модуль Palette KTX предлагает идиоматическую поддержку Kotlin для работы с цветовыми палитрами.
Чтобы использовать этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.palette:palette-ktx:1.0.0" }
Kotlin
dependencies { implementation("androidx.palette:palette-ktx:1.0.0") }
Например, при работе с экземпляром Palette
вы можете получить selected
образец для заданной target
с помощью оператора get ( [ ]
):
val palette = Palette.from(bitmap).generate()
val swatch = palette[target]
Реактивные потоки KTX
Модуль Reactive Streams KTX позволяет создавать наблюдаемый поток LiveData
от издателя ReactiveStreams
.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.6" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.6") }
В качестве примера предположим, что база данных имеет небольшой список пользователей. В своем приложении вы загружаете базу данных в память, а затем отображаете пользовательские данные в своем пользовательском интерфейсе. Для этого вы можете использовать RxJava . Компонент Room
Jetpack может получить список пользователей в виде Flowable
. В этом сценарии вам также необходимо управлять подпиской издателя Rx на протяжении всего срока действия вашего фрагмента или действия.
Однако с LiveDataReactiveStreams
вы можете воспользоваться преимуществами RxJava и его богатым набором операторов и возможностей планирования работы, одновременно работая с простотой LiveData
, как показано в следующем примере:
val fun getUsersLiveData() : LiveData<List<User>> {
val users: Flowable<List<User>> = dao.findUsers()
return LiveDataReactiveStreams.fromPublisher(users)
}
Комната КТХ
Расширения комнат добавляют поддержку сопрограмм для транзакций базы данных.
Чтобы использовать этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.room:room-ktx:2.6.1" }
Kotlin
dependencies { implementation("androidx.room:room-ktx:2.6.1") }
Вот несколько примеров, когда Room теперь использует сопрограммы. В первом примере используется функция suspend
для возврата списка объектов User
, а во втором — Flow
Kotlin для асинхронного возврата списка User
. Обратите внимание, что при использовании Flow
вы также получаете уведомления о любых изменениях в запрашиваемых таблицах.
@Query("SELECT * FROM Users")
suspend fun getUsers(): List<User>
@Query("SELECT * FROM Users")
fun getUsers(): Flow<List<User>>
SQLite KTX
Расширения SQLite заключают код, связанный с SQL, в транзакции, устраняя большое количество шаблонного кода.
Чтобы использовать этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
Groovy
dependencies { implementation "androidx.sqlite:sqlite-ktx:2.4.0" }
Kotlin
dependencies { implementation("androidx.sqlite:sqlite-ktx:2.4.0") }
Вот пример использования расширения transaction
для выполнения транзакции базы данных:
db.transaction {
// insert data
}
Просмотр модели KTX
Библиотека ViewModel KTX предоставляет функцию viewModelScope()
, которая упрощает запуск сопрограмм из вашей ViewModel
. CoroutineScope
привязан к Dispatchers.Main
и автоматически отменяется при очистке ViewModel
. Вы можете использовать viewModelScope()
вместо создания новой области для каждой ViewModel
.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
классный
dependencies { implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6" }
Котлин
dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6") }
Например, следующая функция viewModelScope()
запускает сопрограмму, которая выполняет сетевой запрос в фоновом потоке. Библиотека выполняет всю настройку и очистку соответствующей области:
class MainViewModel : ViewModel() {
// Make a network request without blocking the UI thread
private fun makeNetworkRequest() {
// launch a coroutine in viewModelScope
viewModelScope.launch {
remoteApi.slowFetch()
...
}
}
// No need to override onCleared()
}
Менеджер работ КТХ
WorkManager KTX обеспечивает первоклассную поддержку сопрограмм.
Чтобы включить этот модуль, добавьте следующее в файл build.gradle
вашего приложения:
классный
dependencies { implementation "androidx.work:work-runtime-ktx:2.9.1" }
Котлин
dependencies { implementation("androidx.work:work-runtime-ktx:2.9.1") }
Вместо расширения Worker
теперь вы можете расширить CoroutineWorker
, у которого немного другой API. Например, если вы хотите создать простой CoroutineWorker
для выполнения некоторых сетевых операций, вы можете сделать следующее:
class CoroutineDownloadWorker(context: Context, params: WorkerParameters)
: CoroutineWorker(context, params) {
override suspend fun doWork(): Result = coroutineScope {
val jobs = (0 until 100).map {
async {
downloadSynchronously("https://www.google.com")
}
}
// awaitAll will throw an exception if a download fails, which
// CoroutineWorker will treat as a failure
jobs.awaitAll()
Result.success()
}
}
Дополнительные сведения об использовании CoroutineWorker
см. в разделе Потоки в CoroutineWorker .
WorkManager KTX также добавляет функции расширения в Operations
и ListenableFutures
для приостановки текущей сопрограммы.
Вот пример, который приостанавливает Operation
, возвращаемую функцией enqueue()
:
// Inside of a coroutine...
// Run async operation and suspend until completed.
WorkManager.getInstance()
.beginWith(longWorkRequest)
.enqueue().await()
// Resume after work completes...
Другие модули KTX
Вы также можете включить дополнительные модули KTX, существующие за пределами AndroidX.
Огневая база КТХ
Некоторые SDK Firebase для Android содержат библиотеки расширений Kotlin, которые позволяют вам писать идиоматический код Kotlin при использовании Firebase в вашем приложении. Для получения дополнительной информации см. следующие темы:
Платформа Google Карт KTX
Для Android SDK платформы Google Maps доступны расширения KTX, которые позволяют вам использовать преимущества некоторых функций языка Kotlin, таких как функции расширения, именованные параметры и аргументы по умолчанию, объявления деструктуризации и сопрограммы. Для получения дополнительной информации см. следующие темы:
Играть в ядро KTX
Play Core KTX добавляет поддержку Cotlin Coroutines для одноразовых запросов и потока для мониторинга обновлений статуса, добавив функции расширения в SplitInstallManager
и AppUpdateManager
в библиотеке Play Core.
Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle
:
Groovy
dependencies { implementation "com.google.android.play:core-ktx:1.8.1" }
Kotlin
dependencies { implementation("com.google.android.play:core-ktx:1.8.1") }
Вот пример Flow
мониторинга статуса:
// Inside of a coroutine...
// Request in-app update status updates.
manager.requestUpdateFlow().collect { updateResult ->
when (updateResult) {
is AppUpdateResult.Available -> TODO()
is AppUpdateResult.InProgress -> TODO()
is AppUpdateResult.Downloaded -> TODO()
AppUpdateResult.NotAvailable -> TODO()
}
}
Дополнительная информация
Чтобы узнать больше об Android KTX, см. Видео Devbytes .
Чтобы сообщить о проблеме или предложить функцию, используйте Android KTX -трекер .
,Android KTX Часть Android JetPack .
Android KTX - это набор расширений Kotlin, которые включены в Android JetPack и другие библиотеки Android. Расширения KTX обеспечивают краткий, идиоматический котлин для JetPack, Android Platform и другие API. Для этого эти расширения используют несколько языковых функций Kotlin, в том числе следующие:
- Функции расширения
- Расширенные свойства
- Лямбдас
- Названные параметры
- Параметр значения по умолчанию
- Кораки
Например, при работе с SharedPreferences
вы должны создать редактор , прежде чем вы сможете внести изменения в данные настройки. Вы также должны применить или совершать эти изменения, когда вы закончите редактирование, как показано в следующем примере:
sharedPreferences
.edit() // create an Editor
.putBoolean("key", value)
.apply() // write to disk asynchronously
Котлин Lambdas идеально подходит для этого варианта использования. Они позволяют вам использовать более краткий подход, передавая блок кода для выполнения после создания редактора, позволяя коду выполнять, а затем позволив API SharedPreferences
применить изменения атомно.
Вот пример одной из основных функций Android KTX, SharedPreferences.edit
, которая добавляет функцию редактирования в SharedPreferences
. Эта функция принимает необязательный boolean
флаг в качестве первого аргумента, который указывает, следует ли совершать или применять изменения. Он также получает действие для выполнения в редакторе SharedPreferences
в виде Lambda.
// SharedPreferences.edit extension function signature from Android KTX - Core
// inline fun SharedPreferences.edit(
// commit: Boolean = false,
// action: SharedPreferences.Editor.() -> Unit)
// Commit a new value asynchronously
sharedPreferences.edit { putBoolean("key", value) }
// Commit a new value synchronously
sharedPreferences.edit(commit = true) { putBoolean("key", value) }
Звонитель может выбрать, следует ли совершать или применять изменения. action
Lambda сама по себе является анонимной функцией расширения на SharedPreferences.Editor
, которая возвращает Unit
, как указано его подписью. Вот почему внутри блока вы можете выполнить работу непосредственно на SharedPreferences.Editor
.
Наконец, подпись SharedPreferences.edit()
содержит inline
ключевое слово. Это ключевое слово говорит компилятору Kotlin, что он должен копировать и вставлять (или встроить ) скомпилированный байт -код для функции каждый раз, когда используется функция. Это позволяет избежать накладных расходов на создание нового класса для каждого action
каждый раз, когда используется эта функция.
Этот шаблон передачи кода с использованием лямбдас, применение разумных дефолтов, которые могут быть переопределены, и добавление этих поведений к существующим API с использованием inline
функций расширения, типично для улучшений, предоставленных библиотекой Android KTX.
Используйте Android KTX в своем проекте
Чтобы начать использовать Android KTX, добавьте следующую зависимость в файл вашего проекта build.gradle
:
классный
repositories { google() }
Котлин
repositories { google() }
Модули Androidx
Android KTX организован в модули, где каждый модуль содержит один или несколько пакетов.
Вы должны включить зависимость для каждого артефакта модуля в файл вашего приложения build.gradle
. Не забудьте добавить номер версии к артефакту. Вы можете найти последние номера версий в соответствующем разделе каждого артефакта в этой теме.
Android KTX содержит один базовый модуль , который обеспечивает расширения Kotlin для общих платформ API и несколько специфических для домена расширений.
За исключением основного модуля, все артефакты модуля KTX заменяют базовую зависимость Java в вашем файле build.gradle
. Например, вы можете заменить androidx.fragment:fragment
зависимость с androidx.fragment:fragment-ktx
. Этот синтаксис помогает лучше управлять управлением версиями и не добавляет дополнительных требований объявления о зависимости.
Основной KTX
Основной модуль KTX предоставляет расширения для общих библиотек, которые являются частью Android Framework. Эти библиотеки не имеют зависимостей на основе Java, которые вам необходимо добавить в build.gradle
.
Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle
:
Groovy
dependencies { implementation "androidx.core:core-ktx:1.13.1" }
Kotlin
dependencies { implementation("androidx.core:core-ktx:1.13.1") }
Вот список пакетов, которые содержатся в модуле Core KTX:
- Androidx.core.animation
- androidx.core.content
- androidx.core.content.res
- androidx.core.database
- androidx.core.database.sqlite
- Androidx.core.graphics
- Androidx.core.graphics.Drawable
- androidx.core.location
- androidx.core.net
- Androidx.core.os
- androidx.core.text
- Androidx.core.transition
- androidx.core.util
- androidx.core.view
- androidx.core.widget
Коллекция KTX
Расширения коллекции содержат полезные функции для работы с библиотеками Android, эффективными для памяти, включая ArrayMap
, LongSparseArray
, LruCache
и другие.
Чтобы использовать этот модуль, добавьте следующее в файл вашего приложения build.gradle
:
Groovy
dependencies { implementation "androidx.collection:collection-ktx:1.4.4" }
Kotlin
dependencies { implementation("androidx.collection:collection-ktx:1.4.4") }
Расширения сбора используют преимущества перегрузки оператора Котлина, чтобы упростить такие вещи, как конкатенация сбора, как показано в следующем примере:
// Combine 2 ArraySets into 1.
val combinedArraySet = arraySetOf(1, 2, 3) + arraySetOf(4, 5, 6)
// Combine with numbers to create a new sets.
val newArraySet = combinedArraySet + 7 + 8
Фрагмент ktx
Модуль фрагмента KTX предоставляет ряд расширений для упрощения API фрагмента.
Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle
:
Groovy
dependencies { implementation "androidx.fragment:fragment-ktx:1.8.4" }
Kotlin
dependencies { implementation("androidx.fragment:fragment-ktx:1.8.4") }
С помощью модуля фрагмента KTX вы можете упростить транзакции фрагментов с помощью Lambdas, например:
fragmentManager().commit {
addToBackStack("...")
setCustomAnimations(
R.anim.enter_anim,
R.anim.exit_anim)
add(fragment, "...")
}
Вы также можете привязаться к ViewModel
в одной строке, используя Delegates свойства viewModels
и activityViewModels
:
// Get a reference to the ViewModel scoped to this Fragment
val viewModel by viewModels<MyViewModel>()
// Get a reference to the ViewModel scoped to its Activity
val viewModel by activityViewModels<MyViewModel>()
Жизненный цикл KTX
Lifecycle KTX определяет LifecycleScope
для каждого объекта Lifecycle
. Любая Coroutine, запущенная в этой области, отменяется при уничтожении Lifecycle
. Вы можете получить доступ к CoroutineScope
Lifecycle
с помощью lifecycle.coroutineScope
или lifecycleOwner.lifecycleScope
.
Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle
:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.6" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.6") }
Следующий пример демонстрирует, как использовать lifecycleOwner.lifecycleScope
для создания предварительно вычисленного текстового асинхронного:
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
val params = TextViewCompat.getTextMetricsParams(textView)
val precomputedText = withContext(Dispatchers.Default) {
PrecomputedTextCompat.create(longTextContent, params)
}
TextViewCompat.setPrecomputedText(textView, precomputedText)
}
}
}
LiveData Ktx
При использовании Livedata вам может потребоваться асинхронно рассчитать значения. Например, вы можете захотеть получить предпочтения пользователя и обслуживать его в свой пользовательский интерфейс. Для этих случаев LiveData KTX предоставляет функцию строителя liveData
, которая вызывает функцию suspend
и служит результату как объект LiveData
.
Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle
:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.8.6" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.6") }
В следующем примере loadUser()
является подвесной функцией, объявленной в другом месте. Вы можете использовать функцию строителя liveData
для вызова loadUser()
асинхронно, а затем использовать emit()
для излучения результата:
val user: LiveData<User> = liveData {
val data = database.loadUser() // loadUser is a suspend function.
emit(data)
}
Для получения дополнительной информации об использовании CORUTINES с LiveData
см. Использование COTLIN CORUTINES с компонентами архитектуры .
Навигация KTX
Каждый компонент навигационной библиотеки имеет свою собственную версию KTX, которая адаптирует API более лаконичным и котлин-идиоматическим.
Чтобы включить эти модули, добавьте следующее в файл вашего приложения build.gradle
:
классный
dependencies { implementation "androidx.navigation:navigation-runtime-ktx:2.8.1" implementation "androidx.navigation:navigation-fragment-ktx:2.8.1" implementation "androidx.navigation:navigation-ui-ktx:2.8.1" }
Котлин
dependencies { implementation("androidx.navigation:navigation-runtime-ktx:2.8.1") implementation("androidx.navigation:navigation-fragment-ktx:2.8.1") implementation("androidx.navigation:navigation-ui-ktx:2.8.1") }
Используйте функции расширения и делегирование свойств для доступа к аргументам назначения и перейти к направлениям, как показано в следующем примере:
class MyDestination : Fragment() {
// Type-safe arguments are accessed from the bundle.
val args by navArgs<MyDestinationArgs>()
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
view.findViewById<Button>(R.id.next)
.setOnClickListener {
// Fragment extension added to retrieve a NavController from
// any destination.
findNavController().navigate(R.id.action_to_next_destination)
}
}
...
}
Палитра ktx
Модуль Palette KTX предлагает идиоматическую поддержку Kotlin для работы с цветовыми палитрами.
Чтобы использовать этот модуль, добавьте следующее в файл вашего приложения build.gradle
:
Groovy
dependencies { implementation "androidx.palette:palette-ktx:1.0.0" }
Kotlin
dependencies { implementation("androidx.palette:palette-ktx:1.0.0") }
Например, при работе с экземпляром Palette
вы можете получить selected
образец для данной target
, используя оператор GET ( [ ]
):
val palette = Palette.from(bitmap).generate()
val swatch = palette[target]
Реактивные потоки ktx
Реактивные потоки KTX Модуль позволяет создавать наблюдаемый поток LiveData
из издателя ReactiveStreams
.
Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle
:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.6" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.6") }
В качестве примера предположим, что база данных с небольшим списком пользователей. В вашем приложении вы загружаете базу данных в память, а затем отображаете пользовательские данные в вашем пользовательском интерфейсе. Чтобы достичь этого, вы можете использовать rxjava . Компонент JetPack Room
может получить список пользователей в качестве Flowable
. В этом сценарии вы также должны управлять подпиской RX Publisher в течение жизни вашего фрагмента или деятельности.
Однако с помощью LiveDataReactiveStreams
вы можете извлечь выгоду из Rxjava и ее богатого набора операторов и возможностей для обучения работы, а также работать с простотой LiveData
, как показано в следующем примере:
val fun getUsersLiveData() : LiveData<List<User>> {
val users: Flowable<List<User>> = dao.findUsers()
return LiveDataReactiveStreams.fromPublisher(users)
}
Комната KTX
Расширения комнаты добавляют поддержку Coroutines для транзакций базы данных.
Чтобы использовать этот модуль, добавьте следующее в файл вашего приложения build.gradle
:
Groovy
dependencies { implementation "androidx.room:room-ktx:2.6.1" }
Kotlin
dependencies { implementation("androidx.room:room-ktx:2.6.1") }
Вот несколько примеров, где в комнате теперь используются коратики. В первом примере используется функция suspend
, чтобы вернуть список User
объектов, в то время как второй использует Flow
Котлина для асинхронного возврата списка User
. Обратите внимание, что при использовании Flow
вы также уведомляете о любых изменениях в таблицах, которые вы запрашиваете.
@Query("SELECT * FROM Users")
suspend fun getUsers(): List<User>
@Query("SELECT * FROM Users")
fun getUsers(): Flow<List<User>>
SQLite KTX
Расширения SQLite Обертывают код, связанный с SQL, в транзакции, исключив много кода шаблона.
Чтобы использовать этот модуль, добавьте следующее в файл вашего приложения build.gradle
:
Groovy
dependencies { implementation "androidx.sqlite:sqlite-ktx:2.4.0" }
Kotlin
dependencies { implementation("androidx.sqlite:sqlite-ktx:2.4.0") }
Вот пример использования расширения transaction
для выполнения транзакции базы данных:
db.transaction {
// insert data
}
ViewModel KTX
Библиотека ViewModel KTX предоставляет функцию viewModelScope()
, которая облегчает запуск CORUTINES с вашей ViewModel
. CoroutineScope
обязан для Dispatchers.Main
и автоматически отменяется при очистке ViewModel
. Вы можете использовать viewModelScope()
вместо создания новой области для каждой ViewModel
.
Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle
:
классный
dependencies { implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6" }
Котлин
dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6") }
В качестве примера, следующая функция viewModelScope()
запускает Coroutine, которая делает сетевой запрос в фоновом потоке. Библиотека обрабатывает всю настройку и соответствующую очистку области:
class MainViewModel : ViewModel() {
// Make a network request without blocking the UI thread
private fun makeNetworkRequest() {
// launch a coroutine in viewModelScope
viewModelScope.launch {
remoteApi.slowFetch()
...
}
}
// No need to override onCleared()
}
Workmanager Ktx
Workmanager KTX обеспечивает первоклассную поддержку для Coroutines.
Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle
:
классный
dependencies { implementation "androidx.work:work-runtime-ktx:2.9.1" }
Котлин
dependencies { implementation("androidx.work:work-runtime-ktx:2.9.1") }
Вместо того, чтобы расширять Worker
, теперь вы можете расширить CoroutineWorker
, который имеет немного другой API. Например, если вы хотите построить простого CoroutineWorker
для выполнения некоторых сетевых операций, вы можете сделать следующее:
class CoroutineDownloadWorker(context: Context, params: WorkerParameters)
: CoroutineWorker(context, params) {
override suspend fun doWork(): Result = coroutineScope {
val jobs = (0 until 100).map {
async {
downloadSynchronously("https://www.google.com")
}
}
// awaitAll will throw an exception if a download fails, which
// CoroutineWorker will treat as a failure
jobs.awaitAll()
Result.success()
}
}
Для получения дополнительной информации об использовании CoroutineWorker
см. Поток в CoroutineWorker .
Workmanager KTX также добавляет функции расширения к Operations
и ListenableFutures
для приостановки текущей коратики.
Вот пример, который приостанавливает Operation
, которая возвращается enqueue()
:
// Inside of a coroutine...
// Run async operation and suspend until completed.
WorkManager.getInstance()
.beginWith(longWorkRequest)
.enqueue().await()
// Resume after work completes...
Другие модули KTX
Вы также можете включить дополнительные модули KTX, которые существуют за пределами Androidx.
Firebase Ktx
У некоторых из SDK Firebase для Android есть библиотеки расширения Kotlin, которые позволяют вам писать идиоматический код котлина при использовании Firebase в вашем приложении. Для получения дополнительной информации см. Следующие темы:
Google Maps Platform Ktx
Существуют расширения KTX, доступные для платформы Google Maps Android SDK, которые позволяют использовать преимущества нескольких языковых функций Kotlin, таких как функции расширения, названные параметры и аргументы по умолчанию, объявления деструкции и коратики. Для получения дополнительной информации см. Следующие темы:
Играйте в Core KTX
Play Core KTX добавляет поддержку Cotlin Coroutines для одноразовых запросов и потока для мониторинга обновлений статуса, добавив функции расширения в SplitInstallManager
и AppUpdateManager
в библиотеке Play Core.
Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle
:
Groovy
dependencies { implementation "com.google.android.play:core-ktx:1.8.1" }
Kotlin
dependencies { implementation("com.google.android.play:core-ktx:1.8.1") }
Вот пример Flow
мониторинга статуса:
// Inside of a coroutine...
// Request in-app update status updates.
manager.requestUpdateFlow().collect { updateResult ->
when (updateResult) {
is AppUpdateResult.Available -> TODO()
is AppUpdateResult.InProgress -> TODO()
is AppUpdateResult.Downloaded -> TODO()
AppUpdateResult.NotAvailable -> TODO()
}
}
Дополнительная информация
Чтобы узнать больше об Android KTX, см. Видео Devbytes .
Чтобы сообщить о проблеме или предложить функцию, используйте Android KTX -трекер .