Sobes.tech
Middle

Πώς μπορούμε να λάβουμε μηνύματα στο κύριο νήμα με το Handler και το Looper;

sobes.tech AI

Απάντηση από AI

  1. Δημιουργήστε έναν Handler: Συνδέστε τον με το Looper του κύριου νήματος.
  2. Αποστείλετε ένα Runnable ή Message: Μέσω του Handler για εκτέλεση στο συσχετισμένο νήμα (σε αυτήν την περίπτωση, το κύριο).
// Στο κύριο νήμα
val mainHandler = Handler(Looper.getMainLooper())

// Δημιουργία και αποστολή ενός Runnable
mainHandler.post {
    // Κώδικας που εκτελείται στο κύριο νήμα
}

// Δημιουργία και αποστολή ενός Message
val message = Message.obtain().apply {
    what = 1 // Τυχαίος αναγνωριστής μηνύματος
    obj = "hello" // Επιπλέον δεδομένα
}
mainHandler.sendMessage(message)
  • Looper.getMainLooper() λαμβάνει το Looper που συνδέεται με το κύριο νήμα.
  • Handler(Looper.getMainLooper()) δημιουργεί έναν Handler που θα επεξεργάζεται μηνύματα που αποστέλλονται σε αυτό στο κύριο νήμα.
  • post(Runnable) τοποθετεί το Runnable στη σειρά μηνυμάτων του Looper για εκτέλεση.
  • sendMessage(Message) στέλνει ένα μήνυμα στη σειρά μηνυμάτων του Looper.

Εναλλακτικά: Ανώνυμη κλάση Handler με handleMessage

Μπορείτε να υπερισχύσετε τη μέθοδο handleMessage σε μια ανώνυμη κλάση Handler για επεξεργασία μηνυμάτων.

// Στο κύριο νήμα ή σε άλλο νήμα όπου χρειάζεται να δημιουργήσετε έναν Handler για το κύριο νήμα
val myHandler = object : Handler(Looper.getMainLooper()) {
    override fun handleMessage(msg: Message) {
        // Κώδικας που εκτελείται στο κύριο νήμα κατά τη λήψη μηνύματος
        when (msg.what) {
            1 -> {
                val data = msg.obj as String
                // Επεξεργασία δεδομένων
            }
        }
    }
}

// Αποστολή μηνύματος από άλλο νήμα
Thread {
    val message = Message.obtain().apply {
        what = 1
        obj = "world"
    }
    myHandler.sendMessage(message)
}.start()

Σε αυτήν την περίπτωση, κατά τη λήψη μηνύματος, καλείται η μέθοδος handleMessage στο κύριο νήμα.