Asynchrone Programmierung in Kotlin: Vollständiger Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einführung in die asynchrone Programmierung in Kotlin

Moderne Anwendungen erfordern hohe Leistung und Reaktionsfähigkeit. Asynchrone Programmierung in Kotlin ist ein leistungsstarkes Werkzeug, mit dem Sie nicht-blockierenden Code schreiben und Systemressourcen effizient nutzen können. Im Gegensatz zur traditionellen Multithreading bieten Kotlin-Coroutinen leichtgewichtige Ausführungsthreads, die angehalten und fortgesetzt werden können, ohne den Hauptthread zu blockieren.

In diesem Leitfaden werden wir die Schlüsselkonzepte der asynchronen Programmierung in Kotlin aufschlüsseln: von grundlegenden Coroutinen bis hin zu fortgeschrittenen Mustern mit Flow und Channel. Sie werden lernen, effiziente asynchrone Anwendungen zu erstellen, die schnell und zuverlässig laufen.



Grundlagen von Coroutinen in Kotlin

Was ist eine Coroutine?

Eine Coroutine ist ein leichtgewichtiger Ausführungsthread, der an einem Punkt angehalten und an einem anderen fortgesetzt werden kann. In Kotlin werden Coroutinen auf Sprachebene mit dem Schlüsselwort suspend und speziellen Buildern implementiert.



Starten der ersten Coroutine

Um mit Coroutinen zu arbeiten, müssen Sie eine Abhängigkeit in build.gradle.kts hinzufügen:

dependencies {    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")}

Grundlegendes Beispiel zum Starten einer Coroutine:

import kotlinx.coroutines.*

fun main() = runBlocking { launch { delay(1000L) println("Welt!") } println("Hallo,")}

Ausgeführtes Ergebnis:

Hallo,Welt!


Suspend-Funktionen

Suspend-Funktionen sind Funktionen, die die Ausführung einer Coroutine anhalten können, ohne den Thread zu blockieren. Sie werden mit dem Schlüsselwort suspend markiert:

suspend fun fetchUserData(): String {    delay(2000L) // Simulieren einer Netzwerkanfrage    return "Benutzerdaten"}

fun main() = runBlocking { val data = fetchUserData() println(data)}


Verwalten von Coroutinen: Scope und Dispatcher

CoroutineScope

CoroutineScope definiert den Lebenszyklus von Coroutinen. Alle Coroutinen werden innerhalb eines bestimmten Scopes gestartet. Wenn der Scope abgebrochen wird, werden auch alle seine untergeordneten Coroutinen abgebrochen.

class MyViewModel : ViewModel() {    private val scope = CoroutineScope(Dispatchers.Main + SupervisorJob())        fun loadData() {        scope.launch {            val data = fetchData()            updateUI(data)        }    }        override fun onCleared() {        super.onCleared()        scope.cancel()    }}


Dispatcher: Auswahl des Ausführungsthreads

Dispatcher bestimmen, in welchem Thread-Pool die Coroutine ausgeführt wird. Haupttypen:

  • Dispatchers.Main — für den UI-Thread (Android, JavaFX)
  • Dispatchers.IO — für Ein-/Ausgabeoperationen (Netzwerk, Dateien)
  • Dispatchers.Default — für CPU-intensive Aufgaben
  • Dispatchers.Unconfined — nicht an einen bestimmten Thread gebunden
fun main() = runBlocking {    launch(Dispatchers.IO) {        println("Ausführung auf IO: ${Thread.currentThread().name}")    }    launch(Dispatchers.Default) {        println("Ausführung auf Default: ${Thread.currentThread().name}")    }}


Fortgeschrittene Techniken: async/await und Coroutine-Abbruch

Parallele Ausführung mit async

Der async-Builder ermöglicht es, mehrere Aufgaben parallel zu starten und Ergebnisse mit await() zu erhalten:

suspend fun fetchDataFromApi1(): String {    delay(1000L)    return "Ergebnis von API 1"}

suspend fun fetchDataFromApi2(): String { delay(1500L) return "Ergebnis von API 2"}

fun main() = runBlocking { val time = measureTimeMillis { val result1 = async { fetchDataFromApi1() } val

Blogs

Buchempfehlungen