MWCodebymw.de ↗
Kotlin

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

#Coroutines#Timeout#Netzwerk#Fehlerbehandlung#Kotlin

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 →