Middle
Jak można uzyskać wiadomości na głównym wątku za pomocą Handler i Looper?
sobes.tech AI
Odpowiedź od AI
- Utwórz
Handler: Połącz go zLooperemgłównego wątku. - Prześlij
RunnablelubMessage: Za pomocąHandlerdo wykonania na powiązanym wątku (w tym przypadku - głównym).
// W głównym wątku
val mainHandler = Handler(Looper.getMainLooper())
// Tworzenie i wysyłanie Runnable
mainHandler.post {
// Kod wykonywany na głównym wątku
}
// Tworzenie i wysyłanie Message
val message = Message.obtain().apply {
what = 1 // Dowolny identyfikator wiadomości
obj = "hello" // Dodatkowe dane
}
mainHandler.sendMessage(message)
Looper.getMainLooper()pobieraLooperpowiązany z głównym wątkiem.Handler(Looper.getMainLooper())tworzyHandler, który obsługuje wiadomości wysyłane do niego na głównym wątku.post(Runnable)umieszczaRunnablew kolejce wiadomościLooperdo wykonania.sendMessage(Message)wysyła wiadomość do kolejki wiadomościLooper.
Alternatywa: Klasa anonimowa Handler z handleMessage
Możesz nadpisać metodę handleMessage w anonimowej klasie Handler, aby obsługiwać wiadomości.
// W głównym wątku lub innym wątku, gdzie trzeba utworzyć Handler dla głównego wątku
val myHandler = object : Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message) {
// Kod wykonywany na głównym wątku po otrzymaniu wiadomości
when (msg.what) {
1 -> {
val data = msg.obj as String
// Przetwarzanie danych
}
}
}
}
// Wysyłanie wiadomości z innego wątku
Thread {
val message = Message.obtain().apply {
what = 1
obj = "world"
}
myHandler.sendMessage(message)
}.start()
W tym przypadku, po otrzymaniu wiadomości, wywoływana jest metoda handleMessage na głównym wątku.