withTimeout – hängende Coroutines nach X Sekunden abbrechen
Ein Netzwerkaufruf, der ewig hängt, blockiert deinen Ladezustand für immer. Mit `withTimeout` gibst du einer Coroutine eine Frist – läuft sie ab, bricht Kotlin sie sauber ab.
Ein Server antwortet mal nicht, das Mobilfunknetz ist lahm – und dein Ladespinner dreht sich in alle Ewigkeit. Damit ein Aufruf nicht unbegrenzt hängt, gibst du ihm mit withTimeout eine feste Frist.
Variante 1: Timeout als Fehler
withTimeout wirft eine TimeoutCancellationException, wenn der Block nicht rechtzeitig fertig wird. Die fängst du wie einen normalen Fehler ab:
suspend fun ladeProfil(): Profile = try {
withTimeout(5_000) { // maximal 5 Sekunden
api.getProfile() // ein suspend-Aufruf
}
} catch (e: TimeoutCancellationException) {
throw AppError("Zeitüberschreitung – bitte erneut versuchen")
}Variante 2: null statt Ausnahme
Oft willst du gar keinen Fehler, sondern einfach „nichts". Dafür gibt es withTimeoutOrNull – es liefert null, wenn die Zeit abläuft:
val profil: Profile? = withTimeoutOrNull(5_000) { api.getProfile() }
if (profil == null) {
// Fallback: Cache anzeigen, Hinweis einblenden …
}Wichtig: withTimeout bricht die Coroutine kooperativ ab. Das funktioniert nur, wenn dein Code auf Abbrüche reagiert – bei suspend-Funktionen aus kotlinx.coroutines (Retrofit, Ktor, delay) ist das automatisch der Fall. Reiner, blockierender Java-Code (Thread.sleep, ein synchroner Stream) merkt vom Timeout nichts; solche Aufrufe gehören ohnehin auf Dispatchers.IO und brauchen ein eigenes Zeitlimit.
Robuste Ladezustände sind der Unterschied zwischen „App hängt" und „App fühlt sich schnell an". Wenn du so etwas für deine Android-App brauchst: bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
snapshotFlow in Jetpack Compose – aus Compose-Zustand einen Flow machen
Manchmal willst du auf einen Compose-Zustand reagieren wie auf einen Datenstrom – entprellen, kombinieren, sammeln. Genau das macht snapshotFlow. Ich zeige dir das an der häufigsten Aufgabe: mehr laden, wenn der Nutzer ans Listenende scrollt.
callbackFlow – Listener-APIs in einen Flow verwandeln
Android steckt voller Callback-APIs mit `register`/`unregister`. Mit `callbackFlow` machst du daraus einen ganz normalen Flow – inklusive automatischem Abmelden, wenn niemand mehr zuhört.
kotlinx.serialization: JSON und data class ohne Handarbeit verbinden
Eine API antwortet mit JSON, deine App will eine data class. Dazwischen steht in vielen Projekten ein handgeschriebener Parser. Mit kotlinx.serialization sind es eine Annotation und eine Zeile – und ein Schalter, ohne den deine App beim nächsten API-Update abstürzt.