Sobes.tech
Middle+

Millised ootamatud probleemid võivad Androidis korutinatega töötades tekkida?

sobes.tech AI

Vastus AI-lt

  • Ette oodatud tühistamine (cancellation): Korutina võib ootamatult tühistada, näiteks seadme konfiguratsiooni muutmisel või Activity/Fragment sulgemisel, kui elutsükli kontekst ei ole korralikult hallatud. See võib põhjustada mälulekkeid või mittetäidetud operatsioone.
  • Konteksti edastamise probleemid: Korutina konteksti edastamine rakenduse kihtide vahel (UI, ViewModel, Repository) nõuab tähelepanu. Konteksti vale kasutamine võib põhjustada UI hangumist või voogude blokeerimist.
  • Ressursside lekked mittetöötavate erandite tõttu: Mittetöötavad erandid lastel korutinides võivad tahtmatult tühistada vanema, kuid sisemiselt eraldatud ressursid võivad jääda vabastamata.
  • "Külmad" vood (Flow) ja nende elutsükli haldamine: Flow on loomult laisk ja nõuab aktiivset andmete kogumist. Kui kogumine ei ole õigesti hallatud (näiteks kasutades flowWithLifecycle või collectLatest), võib UI või elutsükli muutuste ajal tekkida soovimatu käitumine.
  • Blokeerivad kutsed: Blokeerivate kutsede (näiteks võrgupõhiste või failitoimingute) lisamine korutinas, mis täidetakse peamise voolu dispetšeris (Dispatchers.Main), põhjustab ANR-i.
// Näide potentsiaalsest probleemist korutina tühistamisel konfiguratsiooni muutmisel
class MyViewModel : ViewModel() {
    fun loadData() {
        viewModelScope.launch {
            // Pikk operatsioon
            delay(5000)
            // Kui Activity taaskäivitatakse selle aja jooksul, võib see rida jääda täitmata
            println("Data loaded")
        }
    }
}

// Näide blokeerivast kõnest peamise dispetšeri peal
import kotlinx.coroutines.*

fun performBlockingOperation() {
    runBlocking { // Ärge kasutage UI voos!
        delay(1000) // Blokeerib voolu
    }
}

// Õige:
fun performNonBlockingOperation() {
    CoroutineScope(Dispatchers.Default).launch {
        delay(1000) // Ei blokeeri peamist voolu
    }
}