Middle
Kaip galima gauti žinutes pagrindiniame sraute naudojant Handler ir Looper?
sobes.tech AI
Atsakymas iš AI
- Sukurti
Handler: susieti jį suLooper, kuris yra pagrindinio srauto. - Paduoti
RunnablearbaMessage: siųsti juos perHandler, 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()gaunaLooper, susietą su pagrindiniu srautu.Handler(Looper.getMainLooper())sukuriaHandler, kuris tvarkys pranešimus, siųstus jam, pagrindiniame sraute.post(Runnable)įdedaRunnableįLooperpranešimų eilę vykdymui.sendMessage(Message)siunčia pranešimą įLooperpraneš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.