Sobes.tech
Middle

Kā var saņemt ziņojumus galvenajā pavedienā, izmantojot Handler un Looper?

sobes.tech AI

Atbilde no AI

  1. Izveidot Handler: sasaistīt to ar Looper, kas ir galvenās pavediena.
  2. Pārsūtīt Runnable vai Message: nosūtīt tos caur Handler, lai izpildītu saistītajā pavedienā (šajā gadījumā - galvenajā).
// Galvenajā pavedienā
val mainHandler = Handler(Looper.getMainLooper())

// Izveidot un nosūtīt Runnable
mainHandler.post {
    // Kods, kas tiek izpildīts galvenajā pavedienā
}

// Izveidot un nosūtīt Message
val message = Message.obtain().apply {
    what = 1 // Nejaušs ziņojuma identifikators
    obj = "hello" // Papildu dati
}
mainHandler.sendMessage(message)
  • Looper.getMainLooper() iegūst Looper, kas ir saistīts ar galveno pavedienu.
  • Handler(Looper.getMainLooper()) izveido Handler, kas apstrādās ziņojumus, kas nosūtīti tam, galvenajā pavedienā.
  • post(Runnable) ievieto Runnable Looper ziņojumu rindā, lai tas tiktu izpildīts.
  • sendMessage(Message) nosūta ziņojumu Looper ziņojumu rindā.

Alternatīva: anonīma Handler klase ar handleMessage

Var pārdefinēt handleMessage metodi anonīmā Handler klasē, lai apstrādātu ziņojumus.

// Galvenajā vai citā pavedienā, kur nepieciešams izveidot `Handler` galvenajam pavedienam
val myHandler = object : Handler(Looper.getMainLooper()) {
    override fun handleMessage(msg: Message) {
        // Kods, kas tiek izpildīts galvenajā pavedienā, saņemot ziņojumu
        when (msg.what) {
            1 -> {
                val data = msg.obj as String
                // Datu apstrāde
            }
        }
    }
}

// Nosūtīt ziņojumu no cita pavediena
Thread {
    val message = Message.obtain().apply {
        what = 1
        obj = "world"
    }
    myHandler.sendMessage(message)
}.start()

Šajā gadījumā, saņemot ziņojumu, tiks izsaukta handleMessage metode galvenajā pavedienā.