withTimeout ve withTimeoutOrNull
Zaman aşımı sarmalayıcılarıyla yürütme süresini sınırlayın ve TimeoutCancellationException durumunu işleyin.
withTimeout ve withTimeoutOrNull, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.
Zaman Aşımları Neden Kullanılır
Korutinler ağ veya G/Ç işlemlerinde süresiz olarak takılı kalabilir. withTimeout, verilen milisaniye içinde tamamlanmazsa bloğu iptal eder.
import kotlinx.coroutines.*
fun main() = runBlocking {
try {
withTimeout(200) {
delay(1000) // simulates slow network
println("This never prints")
}
} catch (e: TimeoutCancellationException) {
println("Timed out!")
}
}withTimeout Temelleri
withTimeout(millis) { ... }, blok sınırı aşarsa TimeoutCancellationException (CancellationException alt sınıfı) fırlatır.
import kotlinx.coroutines.*
suspend fun fetchData(): String {
delay(100)
return "data"
}
fun main() = runBlocking {
val result = withTimeout(500) {
fetchData()
}
println(result) // data
}withTimeoutOrNull
withTimeoutOrNull, zaman aşımında istisna fırlatmak yerine null döndürür; böylece zaman aşımlarını normal akışın bir parçası olarak ele almak kolaylaşır.
import kotlinx.coroutines.*
fun main() = runBlocking {
val result: String? = withTimeoutOrNull(200) {
delay(1000)
"done"
}
println(result ?: "Timeout — using default")
}Dönüş Değeriyle Zaman Aşımı
Her iki fonksiyon da başarı durumunda bloktaki son ifadenin değerini döndürür.
import kotlinx.coroutines.*
fun main() = runBlocking {
val response = withTimeoutOrNull(500) {
delay(100)
mapOf("status" to 200, "body" to "OK")
}
println(response?.get("status")) // 200
}İç İçe Zaman Aşımları
Önce içteki zaman aşımları sona erer. Dıştaki zaman aşımı yalnızca içteki önce iptal etmezse devreye girer — bu, istek başına ve genel zaman aşımlarını ayırmak için kullanışlıdır.
import kotlinx.coroutines.*
fun main() = runBlocking {
withTimeoutOrNull(1000) { // global
withTimeoutOrNull(200) { // per-call
delay(300)
println("inner done") // won't print
} ?: println("Inner timed out")
delay(100)
println("outer still running")
}
}TimeoutCancellationException
TimeoutCancellationException bir CancellationException olduğu için korutin mekanizması tarafından normal iptal olarak ele alınır ve üst kapsama yayılmaz.
import kotlinx.coroutines.*
fun main() = runBlocking {
val job = launch {
try {
withTimeout(100) { delay(1000) }
} catch (e: TimeoutCancellationException) {
println("Caught in child: ${e.message}")
}
}
job.join()
println("Parent still running: ${isActive}")
}Zaman Aşımında Kaynakların Temizlenmesi
Süre dolduğunda bile kaynakları serbest bırakmak için withTimeout içinde finally kullanın.
import kotlinx.coroutines.*
fun main() = runBlocking {
val result = withTimeoutOrNull(150) {
try {
println("Opening resource")
delay(300)
"result"
} finally {
println("Closing resource") // always runs
}
}
println("Result: $result")
}Zaman Aşımlı Yeniden Deneme
Zaman aşımını yeniden deneme mantığıyla birleştirin: bir işlemi deneme başına belirlenen zaman aşımıyla deneyin ve sonuç null olduğunda yeniden deneyin.
import kotlinx.coroutines.*
suspend fun tryFetch(attempt: Int): String? = withTimeoutOrNull(200) {
delay(if (attempt < 3) 300L else 100L) // fails first 2 attempts
"success on attempt $attempt"
}
fun main() = runBlocking {
var result: String? = null
var attempt = 1
while (result == null) {
result = tryFetch(attempt++)
}
println(result)
}ViewModel'de withTimeout
Android ViewModels içinde, yavaş yanıtlar için hata durumunu göstermek üzere depo çağrılarını viewModelScope.launch içinde withTimeoutOrNull ile sarın.
import kotlinx.coroutines.*
// Pseudocode pattern:
suspend fun loadUser(): String = withTimeoutOrNull(3000) {
// repo.getUser()
delay(100)
"Alice"
} ?: "Timeout — using cached data"
fun main() = runBlocking { println(loadUser()) }Kesinlik Uyarısı
withTimeout, korutin dağıtıcısına dayanır. TestCoroutineScheduler kullanan sınamalarda zaman sanaldır ve elle ilerletilebilir.
import kotlinx.coroutines.*
// In unit tests with runTest:
// runTest {
// withTimeout(1000) {
// delay(999) // virtual time — completes instantly
// println("done")
// }
// }
fun main() = runBlocking {
println("Use runTest for virtual-time timeout testing")
}İkisi Arasında Seçim Yapma
Zaman aşımı bir hataysa withTimeout kullanın. Zaman aşımı beklenen bir sonuçsa (örneğin önbellek bulunamaması veya isteğe bağlı önceden getirme) withTimeoutOrNull kullanın.
import kotlinx.coroutines.*
fun main() = runBlocking {
// Mandatory: throw on timeout
// withTimeout(500) { criticalOp() }
// Optional: null on timeout
val cached = withTimeoutOrNull(50) {
delay(200); "fresh"
} ?: "stale"
println(cached)
}Hızlı Kontrol
Blok zaman sınırını aştığında withTimeoutOrNull ne döndürür?
Özet
withTimeout zaman aşımında istisna fırlatır; withTimeoutOrNull null döndürür. Her ikisi de bloğu işbirlikçi biçimde iptal eder ve finally bloklarını çalıştırır. Kaynakları temizlemek için finally, zaman aşımı beklenen bir sonuç olduğunda ise withTimeoutOrNull kullanın.
Sıkça Sorulan Sorular
“withTimeout ve withTimeoutOrNull” dersi ücretsiz mi?
Evet — “withTimeout ve withTimeoutOrNull” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.
“withTimeout ve withTimeoutOrNull” dersinde ne öğreneceğim?
Zaman aşımı sarmalayıcılarıyla yürütme süresini sınırlayın ve TimeoutCancellationException durumunu işleyin. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“withTimeout ve withTimeoutOrNull” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- İş Birlikli İptal: isActive ve ensureActive
- withTimeout ve withTimeoutOrNull
- finally ve NonCancellable ile Temizleme
- Koroutin Hiyerarşilerinde İptal Yayılımı