viewModelScope und Dispatchers
Führen Sie Arbeiten im richtigen Thread aus.
viewModelScope und Dispatchers ist eine kostenlose Android Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Android Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Android Academy-Kurs umfasst insgesamt 4 Lektionen.
Lebenszyklusbewusste Scopes
Android stellt integrierte Scopes bereit, die automatisch abgebrochen werden:
viewModelScope– wird abgebrochen, wenn das ViewModel verworfen wird.lifecycleScope– ist an den Lebenszyklus einer Activity/eines Fragments gebunden.
viewModelScope verwenden
Starten Sie Datenverarbeitung in viewModelScope. Wenn das ViewModel verworfen wird, wird die Coroutine für Sie abgebrochen – ohne manuelle Bereinigung.
class UserViewModel(
private val repo: UserRepository
) : ViewModel() {
fun load() {
viewModelScope.launch {
val users = repo.getUsers()
_uiState.value = UiState(users)
}
}
}Warum nicht GlobalScope
Vermeiden Sie GlobalScope: Seine Coroutines laufen während der gesamten Lebensdauer der App und sind nie an einen Lebenszyklus gebunden. Das kann zu Leaks und zu Arbeit führen, die fortgesetzt wird, nachdem der Bildschirm verschwunden ist.
Was sind Dispatcher?
Ein Dispatcher legt fest, auf welchem Thread (oder in welchem Pool) eine Coroutine ausgeführt wird. Die Wahl des richtigen Dispatchers hält den Hauptthread frei.
Die Standard-Dispatcher
Dispatchers.Main– der UI-Thread.Dispatchers.IO– für Netzwerk- und Festplatten-I/O.Dispatchers.Default– für CPU-intensive Aufgaben.
viewModelScope verwendet standardmäßig Main
viewModelScope startet auf Dispatchers.Main. Das ist für die Aktualisierung des Status in Ordnung, aber aufwendige Aufgaben sollten Sie davon wegverlagern.
Mit withContext wechseln
Verwenden Sie withContext, um einen Block in einem anderen Dispatcher auszuführen und anschließend zum Aufrufer zurückzukehren.
suspend fun loadFile(): String =
withContext(Dispatchers.IO) {
File("data.txt").readText()
}Main-Safe-Funktionen
Eine Funktion ist main-safe, wenn sie sicher vom Hauptthread aus aufgerufen werden kann, weil sie intern den Dispatcher wechselt. Repositories sollten main-safe sein, damit sich Aufrufer nie um Threads kümmern müssen.
class Repo {
suspend fun getUsers() =
withContext(Dispatchers.IO) { dao.getAll() }
}Room und Retrofit sind Main-Safe
Gute Nachricht: suspend-DAO-Methoden von Room und suspend-Aufrufe von Retrofit werden bereits abseits des Hauptthreads ausgeführt. Normalerweise benötigen Sie dafür kein explizites withContext.
CPU-Arbeit auf Default
Verwenden Sie für aufwendige Berechnungen, etwa das Sortieren einer sehr großen Liste oder das Parsen, Dispatchers.Default, um Ruckler in der Benutzeroberfläche zu vermeiden.
val sorted = withContext(Dispatchers.Default) {
bigList.sortedBy { it.score }
}Dispatcher injizieren
Injizieren Sie Dispatcher, statt sie fest zu codieren, um die Testbarkeit zu verbessern. So können Tests einen Test-Dispatcher einsetzen.
class Repo(
private val io: CoroutineDispatcher = Dispatchers.IO
) {
suspend fun load() = withContext(io) { /* ... */ }
}Schnelltest
Testen Sie Ihr Verständnis von Scopes und Dispatchern.
Zusammenfassung
Sie haben gelernt:
viewModelScopebricht Coroutines ab, wenn das ViewModel verworfen wird.- Vermeiden Sie
GlobalScope. - Wählen Sie den passenden Dispatcher: Main (UI), IO (Netzwerk/Festplatte), Default (CPU).
withContextwechselt den Thread; streben Sie main-safe-Funktionen an.
Häufig gestellte Fragen
Ist die Lektion „viewModelScope und Dispatchers“ kostenlos?
Ja — der vollständige Text von „viewModelScope und Dispatchers“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Android Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Android Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „viewModelScope und Dispatchers“?
Führen Sie Arbeiten im richtigen Thread aus. Du übst Android Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Android Academy zu starten?
Keine Vorkenntnisse erforderlich. Android Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „viewModelScope und Dispatchers“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Android Academy-Lektion Code schreiben und ausführen?
Ja. Jede Android Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Grundlagen und Scopes von Coroutines
- viewModelScope und Dispatchers
- Grundlagen von Kotlin Flow
- StateFlow und SharedFlow