Android KTX Teil von Android Jetpack
Android KTX ist eine Reihe von Kotlin-Erweiterungen, die in Android Jetpack und anderen Android-Bibliotheken enthalten sind. KTX-Erweiterungen bieten prägnanten, idiomatischen Kotlin-Code für Jetpack, die Android-Plattform und andere APIs. Dazu nutzen diese Erweiterungen mehrere Kotlin-Sprachfunktionen, darunter:
- Erweiterungsfunktionen
- Erweiterungseigenschaften
- Lambdas
- Benannte Parameter
- Standardwerte der Parameter
- Koroutinen
Wenn Sie beispielsweise mit SharedPreferences
arbeiten, müssen Sie einen Editor erstellen, bevor Sie Änderungen an den Einstellungsdaten vornehmen können. Sie müssen diese Änderungen auch anwenden oder einen Commit durchführen, wenn Sie mit der Bearbeitung fertig sind, wie im folgenden Beispiel gezeigt:
sharedPreferences
.edit() // create an Editor
.putBoolean("key", value)
.apply() // write to disk asynchronously
Kotlin-Lambdas sind für diesen Anwendungsfall perfekt geeignet. Damit können Sie einen kürzeren Ansatz verfolgen. Dazu wird ein Codeblock übergeben, der nach Erstellung des Editors ausgeführt werden soll, der Code ausgeführt wird und die Änderungen dann von der SharedPreferences
API in kleinstmöglichen Schritten angewendet werden.
Hier ist ein Beispiel für eine der Android KTX Core-Funktionen (SharedPreferences.edit
), mit der eine Bearbeitungsfunktion zu SharedPreferences
hinzugefügt wird. Diese Funktion verwendet ein optionales Flag boolean
als erstes Argument, das angibt, ob ein Commit durchgeführt oder die Änderungen angewendet werden sollen. Außerdem erhält es eine Aktion, die im SharedPreferences
-Editor in Form einer Lambda-Funktion ausgeführt werden soll.
// 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) }
Der Aufrufer kann auswählen, ob ein Commit durchgeführt oder die Änderungen angewendet werden sollen. Das Lambda action
ist selbst eine anonyme Erweiterungsfunktion auf SharedPreferences.Editor
, die Unit
zurückgibt, wie durch seine Signatur angegeben. Deshalb können Sie die Arbeit im Block direkt an SharedPreferences.Editor
ausführen.
Schließlich enthält die Signatur SharedPreferences.edit()
das Schlüsselwort inline
.
Dieses Schlüsselwort weist den Kotlin-Compiler an, den kompilierten Bytecode für die Funktion bei jeder Verwendung der Funktion inline zu kopieren und einzufügen.
Dadurch wird der Aufwand vermieden, bei jedem Aufruf dieser Funktion für jede action
eine neue Klasse zu instanziieren.
Dieses Muster, bei dem Code mithilfe von Lambdas weitergegeben, vernünftige Standardeinstellungen angewendet, die überschrieben werden können, und dieses Verhalten mit inline
-Erweiterungsfunktionen vorhandenen APIs hinzufügen, ist typisch für die Verbesserungen der Android KTX-Bibliothek.
Android KTX in Ihrem Projekt verwenden
Fügen Sie der Datei build.gradle
Ihres Projekts die folgende Abhängigkeit hinzu, um Android KTX zu verwenden:
Groovig
repositories { google() }
Kotlin
repositories { google() }
AndroidX-Module
Android KTX ist in Module organisiert, wobei jedes Modul ein oder mehrere Pakete enthält.
Du musst in der Datei build.gradle
deiner Anwendung für jedes Modulartefakt eine Abhängigkeit angeben. Denken Sie daran, die Versionsnummer an das Artefakt anzuhängen.
Die neuesten Versionsnummern finden Sie in diesem Thema im entsprechenden Abschnitt der einzelnen Artefakte.
Android KTX enthält ein einzelnes Kernmodul, das Kotlin-Erweiterungen für gängige Framework-APIs und mehrere domainspezifische Erweiterungen bietet.
Mit Ausnahme des Kernmoduls ersetzen alle KTX-Modulartefakte die zugrunde liegende Java-Abhängigkeit in der Datei build.gradle
. Sie können beispielsweise eine androidx.fragment:fragment
-Abhängigkeit durch androidx.fragment:fragment-ktx
ersetzen. Diese Syntax erleichtert die Versionsverwaltung und fügt keine zusätzlichen Anforderungen an die Deklaration von Abhängigkeiten hinzu.
Kern-KTX
Das Core KTX-Modul enthält Erweiterungen für gängige Bibliotheken, die Teil des Android-Frameworks sind. Diese Bibliotheken haben keine Java-basierten Abhängigkeiten, die Sie zu build.gradle
hinzufügen müssen.
Füge der Datei build.gradle
deiner App Folgendes hinzu, um dieses Modul einzubeziehen:
Groovig
dependencies { implementation "androidx.core:core-ktx:1.13.1" }
Kotlin
dependencies { implementation("androidx.core:core-ktx:1.13.1") }
Hier ist eine Liste der Pakete, die im Core KTX-Modul enthalten sind:
- 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
Sammlung KTX
Sammlungserweiterungen enthalten Dienstfunktionen für die Arbeit mit den speichereffizienten Sammlungsbibliotheken von Android, darunter ArrayMap
, LongSparseArray
und LruCache
.
Füge der Datei build.gradle
deiner App Folgendes hinzu, um dieses Modul zu verwenden:
Groovig
dependencies { implementation "androidx.collection:collection-ktx:1.4.0" }
Kotlin
dependencies { implementation("androidx.collection:collection-ktx:1.4.0") }
Sammlungserweiterungen nutzen die Überlastung der Kotlin-Operatoren und vereinfachen so Dinge wie die Verkettung von Sammlungen, wie im folgenden Beispiel gezeigt:
// 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
Das Fragment KTX-Modul enthält eine Reihe von Erweiterungen, mit denen die Fragment API vereinfacht werden kann.
Füge der Datei build.gradle
deiner App Folgendes hinzu, um dieses Modul einzubeziehen:
Groovig
dependencies { implementation "androidx.fragment:fragment-ktx:1.8.1" }
Kotlin
dependencies { implementation("androidx.fragment:fragment-ktx:1.8.1") }
Mit dem Modul Fragment KTX können Sie Fragmenttransaktionen mit Lambdas vereinfachen. Beispiel:
fragmentManager().commit {
addToBackStack("...")
setCustomAnimations(
R.anim.enter_anim,
R.anim.exit_anim)
add(fragment, "...")
}
Sie können auch in einer Zeile an eine ViewModel
binden, indem Sie die Attributdelegate viewModels
und activityViewModels
verwenden:
// 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>()
Lebenszyklus-KTX
Der Lebenszyklus von KTX definiert eine LifecycleScope
für jedes Lifecycle
-Objekt. Jede in diesem Bereich gestartete Koroutine wird abgebrochen, wenn Lifecycle
gelöscht wird. Sie können über die Attribute lifecycle.coroutineScope
oder lifecycleOwner.lifecycleScope
auf den CoroutineScope
von Lifecycle
zugreifen.
Füge der Datei build.gradle
deiner App Folgendes hinzu, um dieses Modul einzubeziehen:
Groovig
dependencies { implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.2" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.2") }
Das folgende Beispiel zeigt, wie Sie mit lifecycleOwner.lifecycleScope
asynchron vorberechneten Text erstellen:
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
Bei der Verwendung von LiveData müssen Sie Werte möglicherweise asynchron berechnen. Sie können beispielsweise die Einstellungen eines Nutzers abrufen und auf Ihrer UI bereitstellen. In diesen Fällen bietet LiveData KTX eine liveData
-Builder-Funktion, die eine suspend
-Funktion aufruft und das Ergebnis als LiveData
-Objekt bereitstellt.
Füge der Datei build.gradle
deiner App Folgendes hinzu, um dieses Modul einzubeziehen:
Groovig
dependencies { implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.8.2" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.2") }
Im folgenden Beispiel ist loadUser()
eine Anhaltefunktion, die an anderer Stelle deklariert wurde.
Sie können die Builder-Funktion liveData
verwenden, um loadUser()
asynchron aufzurufen, und dann emit()
verwenden, um das Ergebnis auszugeben:
val user: LiveData<User> = liveData {
val data = database.loadUser() // loadUser is a suspend function.
emit(data)
}
Weitere Informationen zur Verwendung von Koroutinen mit LiveData
finden Sie unter Kotlin-Koroutinen mit Architekturkomponenten verwenden.
Navigation KTX
Jede Komponente der Navigationsbibliothek hat eine eigene KTX-Version, die die API so anpasst, dass sie prägnanter und idiomatischer Kotlin ist.
Fügen Sie der Datei build.gradle
Ihrer App Folgendes hinzu, um diese Module einzubinden:
Groovig
dependencies { implementation "androidx.navigation:navigation-runtime-ktx:2.7.7" implementation "androidx.navigation:navigation-fragment-ktx:2.7.7" implementation "androidx.navigation:navigation-ui-ktx:2.7.7" }
Kotlin
dependencies { implementation("androidx.navigation:navigation-runtime-ktx:2.7.7") implementation("androidx.navigation:navigation-fragment-ktx:2.7.7") implementation("androidx.navigation:navigation-ui-ktx:2.7.7") }
Verwenden Sie die Erweiterungsfunktionen und die Attributdelegierung, um auf Zielargumente zuzugreifen und zu Zielen zu wechseln, wie im folgenden Beispiel gezeigt:
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
Das Palette KTX-Modul bietet idiomatische Kotlin-Unterstützung für die Arbeit mit Farbpaletten.
Füge der Datei build.gradle
deiner App Folgendes hinzu, um dieses Modul zu verwenden:
Groovig
dependencies { implementation "androidx.palette:palette-ktx:1.0.0" }
Kotlin
dependencies { implementation("androidx.palette:palette-ktx:1.0.0") }
Wenn Sie beispielsweise mit einer Palette
-Instanz arbeiten, können Sie das Muster selected
für eine bestimmte target
abrufen, indem Sie den get-Operator ([ ]
) verwenden:
val palette = Palette.from(bitmap).generate()
val swatch = palette[target]
Reaktive Streams KTX
Mit dem Reactive Streams KTX-Modul können Sie einen beobachtbaren LiveData
-Stream von einem ReactiveStreams
-Publisher erstellen.
Füge der Datei build.gradle
deiner App Folgendes hinzu, um dieses Modul einzubeziehen:
Groovig
dependencies { implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.2" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.2") }
Nehmen wir als Beispiel eine Datenbank mit einer kleinen Liste von Nutzenden. In Ihrer Anwendung laden Sie die Datenbank in den Arbeitsspeicher und zeigen dann Nutzerdaten in Ihrer UI an. Sie können dazu RxJava verwenden.
Die Jetpack-Komponente Room
kann die Nutzerliste als Flowable
abrufen. In diesem Szenario musst du auch das Rx-Publisher-Abo für die gesamte Lebensdauer deines Fragments oder deiner Aktivität verwalten.
Mit LiveDataReactiveStreams
können Sie jedoch von RxJava und seinen zahlreichen Operatoren und Arbeitplanungsfunktionen profitieren und gleichzeitig mit der Einfachheit von LiveData
arbeiten, wie im folgenden Beispiel gezeigt:
val fun getUsersLiveData() : LiveData<List<User>> {
val users: Flowable<List<User>> = dao.findUsers()
return LiveDataReactiveStreams.fromPublisher(users)
}
Raum-KTX
Mit Raumerweiterungen werden Koroutinen für Datenbanktransaktionen unterstützt.
Füge der Datei build.gradle
deiner App Folgendes hinzu, um dieses Modul zu verwenden:
Groovig
dependencies { implementation "androidx.room:room-ktx:2.6.1" }
Kotlin
dependencies { implementation("androidx.room:room-ktx:2.6.1") }
Hier sind einige Beispiele, in denen Room jetzt Koroutinen verwendet. Im ersten Beispiel wird eine suspend
-Funktion verwendet, um eine Liste von User
-Objekten zurückzugeben. Im zweiten Beispiel wird Flow
von Kotlin verwendet, um die User
-Liste asynchron zurückzugeben. Wenn Sie Flow
verwenden, werden Sie auch über Änderungen an den abgefragten Tabellen informiert.
@Query("SELECT * FROM Users")
suspend fun getUsers(): List<User>
@Query("SELECT * FROM Users")
fun getUsers(): Flow<List<User>>
SQLite KTX
SQLite-Erweiterungen fassen SQL-bezogenen Code in Transaktionen um, wodurch eine große Menge an Boilerplate-Code eliminiert wird.
Füge der Datei build.gradle
deiner App Folgendes hinzu, um dieses Modul zu verwenden:
Groovig
dependencies { implementation "androidx.sqlite:sqlite-ktx:2.4.0" }
Kotlin
dependencies { implementation("androidx.sqlite:sqlite-ktx:2.4.0") }
Hier ein Beispiel für die Verwendung der Erweiterung transaction
für eine Datenbanktransaktion:
db.transaction {
// insert data
}
Modell KTX ansehen
Die ViewModel KTX-Bibliothek bietet eine viewModelScope()
-Funktion, mit der Koroutinen einfacher aus ViewModel
gestartet werden können. Der CoroutineScope
ist an Dispatchers.Main
gebunden und wird automatisch abgebrochen, wenn ViewModel
gelöscht wird. Sie können viewModelScope()
verwenden, anstatt für jede ViewModel
einen neuen Bereich zu erstellen.
Füge der Datei build.gradle
deiner App Folgendes hinzu, um dieses Modul einzubeziehen:
Groovig
dependencies { implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.2" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.2") }
Die folgende viewModelScope()
-Funktion startet beispielsweise eine Koroutine, die eine Netzwerkanfrage in einem Hintergrundthread ausführt. Die Bibliothek übernimmt die gesamte Einrichtung und die entsprechende Bereichslöschung:
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 bietet erstklassigen Support für Koroutinen.
Füge der Datei build.gradle
deiner App Folgendes hinzu, um dieses Modul einzubeziehen:
Groovig
dependencies { implementation "androidx.work:work-runtime-ktx:2.9.0" }
Kotlin
dependencies { implementation("androidx.work:work-runtime-ktx:2.9.0") }
Anstatt Worker
zu erweitern, können Sie jetzt CoroutineWorker
erweitern, die eine etwas andere API hat. Wenn Sie beispielsweise ein einfaches CoroutineWorker
erstellen möchten, um einige Netzwerkvorgänge auszuführen, können Sie so vorgehen:
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()
}
}
Weitere Informationen zur Verwendung von CoroutineWorker
finden Sie unter Threading in CoroutineWorker.
WorkManager KTX fügt Operations
und ListenableFutures
außerdem Erweiterungsfunktionen hinzu, um die aktuelle Koroutine anzuhalten.
Im folgenden Beispiel wird das von enqueue()
zurückgegebene Operation
angehalten:
// Inside of a coroutine...
// Run async operation and suspend until completed.
WorkManager.getInstance()
.beginWith(longWorkRequest)
.enqueue().await()
// Resume after work completes...
Andere KTX-Module
Sie können auch zusätzliche KTX-Module einbinden, die außerhalb von AndroidX vorhanden sind.
Firebase KTX
Einige der Firebase SDKs für Android haben Kotlin-Erweiterungsbibliotheken, mit denen Sie idiomatischen Kotlin-Code schreiben können, wenn Sie Firebase in Ihrer App verwenden. Weitere Informationen finden Sie in den folgenden Themen:
Google Maps Platform KTX
Für die Google Maps Platform Android SDKs sind KTX-Erweiterungen verfügbar, mit denen Sie verschiedene Kotlin-Sprachfunktionen wie Erweiterungsfunktionen, benannte Parameter und Standardargumente, destruktive Deklarationen und Koroutinen nutzen können. Weitere Informationen finden Sie in den folgenden Themen:
Core KTX spielen
Play Core KTX unterstützt Kotlin-Coroutinen für einmalige Anfragen und Flow für die Überwachung von Statusaktualisierungen. Dazu werden SplitInstallManager
und AppUpdateManager
in der Play Core-Bibliothek Erweiterungsfunktionen hinzugefügt.
Füge der Datei build.gradle
deiner App Folgendes hinzu, um dieses Modul einzubeziehen:
Groovig
dependencies { implementation "com.google.android.play:core-ktx:1.8.1" }
Kotlin
dependencies { implementation("com.google.android.play:core-ktx:1.8.1") }
Hier ein Beispiel für eine Flow
zur Statusüberwachung:
// 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()
}
}
Weitere Informationen
Weitere Informationen zu Android KTX finden Sie im DevBytes-Video.
Wenn Sie ein Problem melden oder eine Funktion vorschlagen möchten, verwenden Sie die Android KTX-Problemverfolgung.