Sobes.tech
Middle

Kaip galima gauti žinutes pagrindiniame sraute naudojant Handler ir Looper?

sobes.tech AI

Atsakymas iš AI

  1. Sukurti Handler: susieti jį su Looper, kuris yra pagrindinio srauto.
  2. Paduoti Runnable arba Message: siųsti juos per Handler, kad būtų vykdyti susietame sraute (šiuo atveju - pagrindiniame).
// Pagrindiniame sraute
val mainHandler = Handler(Looper.getMainLooper())

// Sukurti ir siųsti Runnable
mainHandler.post {
    // Kodas, vykdomas pagrindiniame sraute
}

// Sukurti ir siųsti Message
val message = Message.obtain().apply {
    what = 1 // Atsitiktinis pranešimo identifikatorius
    obj = "hello" // Papildomi duomenys
}
mainHandler.sendMessage(message)
  • Looper.getMainLooper() gauna Looper, susietą su pagrindiniu srautu.
  • Handler(Looper.getMainLooper()) sukuria Handler, kuris tvarkys pranešimus, siųstus jam, pagrindiniame sraute.
  • post(Runnable) įdeda Runnable į Looper pranešimų eilę vykdymui.
  • sendMessage(Message) siunčia pranešimą į Looper pranešimų eilę.

Alternatyva: anoniminis Handler klasės su handleMessage

Galite perrašyti handleMessage metodą anoniminiame Handler klasėje, kad apdorotumėte pranešimus.

// Pagrindiniame sraute arba kitame sraute, kur reikia sukurti Handlerį pagrindiniam srautui
val myHandler = object : Handler(Looper.getMainLooper()) {
    override fun handleMessage(msg: Message) {
        // Kodas, vykdomas pagrindiniame sraute, gaunant pranešimą
        when (msg.what) {
            1 -> {
                val data = msg.obj as String
                // Duomenų apdorojimas
            }
        }
    }
}

// Siųsti pranešimą iš kito srauto
Thread {
    val message = Message.obtain().apply {
        what = 1
        obj = "world"
    }
    myHandler.sendMessage(message)
}.start()

Šiuo atveju, kai gaunamas pranešimas, iškviečiamas handleMessage metodas pagrindiniame sraute.