接下来我将详细讲解“花样使用Handler与源码分析”的完整攻略。
概述
在Android应用程序中使用Handler,可以让UI线程和工作线程之间进行消息传递,从而实现UI更新。Handler是实现线程间通信的强大的工具,熟练使用Handler可以很好地提高Android应用程序的响应性和性能。
本文将介绍使用Handler的基本原则和使用技巧,并解析Handler的源码,帮助开发者更好地掌握Handler的使用。
Handler的基本原则
-
Handler的创建必须在主线程中进行。
-
每个Handler实例关联一个Looper和MessageQueue。
-
Handler可以将Runnable或Message对象投递到MessageQueue中。
-
通过Handler.post或Handler.sendMessage方法可以向MessageQueue中投递Runnable或Message对象。
-
当Handler处理消息时,它会与当前的线程进行关联。
-
Handler可以用于实现定时器功能。
-
Handler不建议用作数据存储容器。建议使用其他合适的数据存储方式。
Handler的使用技巧
以下是使用Handler的一些技巧。
把Handler放在子线程中
Handler通常与主线程关联,但也可以与其他线程关联。在UI线程中使用Handler可以更新UI,但是在子线程中使用Handler也可以执行一些耗时操作,从而避免阻塞UI线程。下面是使用Handler在子线程中执行的示例。
val handler = Handler(Looper.getMainLooper())
Thread(Runnable {
// 一些耗时的操作
val message = handler.obtainMessage(1, "result")
handler.sendMessage(message)
}).start()
val handlerCallback = object : Handler.Callback {
override fun handleMessage(msg: Message): Boolean {
// 处理消息
return true
}
}
val handler = Handler(Looper.getMainLooper(), handlerCallback)
Thread(Runnable {
// 一些耗时的操作
val message = Message.obtain()
message.what = 1
message.obj = "result"
handler.sendMessage(message)
}).start()
使用Handler实现UI更新
在Android应用程序中经常需要在子线程中进行耗时操作,并在操作完成后更新UI。为了实现UI更新,我们需要使用Handler。下面是使用Handler在子线程中更新UI的示例。
val handler = Handler(Looper.getMainLooper())
Thread(Runnable {
// 在子线程中执行耗时操作
val message = handler.obtainMessage()
message.what = 1
message.obj = "result"
handler.sendMessage(message)
}).start()
val handlerCallback = object : Handler.Callback {
override fun handleMessage(msg: Message): Boolean {
when (msg.what) {
1 -> {
// 更新UI
textView.text = msg.obj.toString()
}
}
return true
}
}
val handler = Handler(Looper.getMainLooper(), handlerCallback)
Thread(Runnable {
// 在子线程中执行耗时操作
val message = Message.obtain()
message.what = 1
message.obj = "result"
handler.sendMessage(message)
}).start()
Handler源码分析
本节将对Handler的源码进行分析。
Handler的构造函数
Handler的构造函数中关联了Looper和MessageQueue。Handler通过Looper.getMainLooper()方法获取UI线程的Looper,这使得Handler与UI线程关联。而MessageQueue是由Looper创建的,每个Handler实例的Message对象都是存储在该MessageQueue中的。
class Handler(looper: Looper = Looper.myLooper() !!
): Object(), Callback {
private var mLooper = looper
private var mQueue: MessageQueue = looper.mQueue
}
Handler.post方法的实现
Handler.post方法用来将Runnable对象放入MessageQueue中,以便在未来某个时刻运行该Runnable。当Handler.post方法调用时,它会创建一个新的Message对象,然后将该Message对象发送到当前Handler关联的MessageQueue中。
fun post(r: Runnable): Boolean {
return sendMessageDelayed(getPostMessage(r), 0)
}
fun sendMessageDelayed(msg: Message, delayMillis: Long): Boolean {
if (delayMillis < 0) {
delayMillis = 0
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis)
}
fun sendMessageAtTime(msg: Message, uptimeMillis: Long): Boolean {
val queue: MessageQueue = mQueue
if (queue == null) {
throw IllegalStateException("Handler not attached")
}
return enqueueMessage(queue, msg, uptimeMillis)
}
private fun enqueueMessage(queue: MessageQueue, msg: Message, uptimeMillis: Long): Boolean {
msg.target = this
return queue.enqueueMessage(msg, uptimeMillis)
}
Handler.sendMessage方法的实现
Handler.sendMessage方法用来将Message对象放入MessageQueue中,以便在未来某个时刻运行该对象。当Handler.sendMessage方法调用时,它会创建一个新的Message对象,然后将该Message对象发送到当前Handler关联的MessageQueue中。
fun sendMessage(msg: Message): Boolean {
return sendMessageDelayed(msg, 0)
}
fun sendMessageDelayed(msg: Message, delayMillis: Long): Boolean {
if (delayMillis < 0) {
delayMillis = 0
}
val uptimeMillis: Long = SystemClock.uptimeMillis() + delayMillis
return sendMessageAtTime(msg, uptimeMillis)
}
fun sendMessageAtTime(msg: Message, uptimeMillis: Long): Boolean {
val queue: MessageQueue = mQueue
if (queue == null) {
throw IllegalStateException("Handler not attached")
}
return enqueueMessage(queue, msg, uptimeMillis)
}
private fun enqueueMessage(queue: MessageQueue, msg: Message, uptimeMillis: Long): Boolean {
msg.target = this
return queue.enqueueMessage(msg, uptimeMillis)
}
Handler.handleMessage方法的实现
Handler.handleMessage方法是一个抽象方法。当有消息需要处理时,Handler会调用该方法。子类需要重写该方法,以根据不同的消息类型执行不同的操作。对于不同的消息类型,Handler会执行不同的操作。是最终实现逻辑,前面的方法都是为它服务。
open fun handleMessage(msg: Message) {
}
以上就是本文的“花样使用Handler与源码分析”的完整攻略,希望对您的学习有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:花样使用Handler与源码分析 - Python技术站