作为一个Android的初学者,对于Handler的机制与用法可以说是门外汉。什么是Handler,如何传递 Message,传递 Runnable 对象,传递 Callback 对象,Handler 原理是什么?下面我就以一个初学者的视角为大家介绍这些知识。
首先,关于什么是Handler。当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件, 进行事件分发,比如说,你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。如果此时需要一个耗时的操作,例如: 联网读取数据, 或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 "强制关闭"。 这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的, 也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。 这个时候,Handler就出现了来解决这个复杂的问题 ,由于Handler运行在主线程中(UI线程中), 它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的Message对象,把这些消息放入主线程队列中,配合主线程进行更新UI。
介绍完了Handler,下面就来介绍介绍他能干什么。handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),它有两个作用:
(1)安排消息或Runnable 在某个主线程中某个地方执行;
(2)安排一个动作在不同的线程中执行。
传递 Message的示例代码:
post(Ruannable);
postAtTime(Runnable,long);
postDelayed(Runnablelong);
传递 Runnable 对象的示例代码
sendEmptyMessage(int);
sendMessage(Message);
sendMessageAtTime(Message,long);
sendMessageDelayed(Message,long);
sendMessage 类方法,允许你安排一个带数据的 Message 对象到队列中,等待更新。
传递 Callback 对象的示例代码:
publicHandler mHandler =newHandler(newHandler.Callback(){
@Override
publicbooleanhandleMessage(Message msg){
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),"HandleMessage 1", Toast.LENGTH_SHORT).show();
returntrue;
}
})
{
publicvoidhandleMessage(Message msg){
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),"handleMessage 1", Toast.LENGTH_SHORT).show(); };
}
关于Handler 的原理,作为一个初学者,看了也是一知半解,就只能依葫芦画瓢地解释一波。
Handler 封装了消息的发送(主要包括消息发送给谁) Looper:内部包含一个消息队列也就是 MessageQueue,所有 Handler 发送的消息都走向这个队列。Looper.loop()方法,就是一个 for 死循环,不断的从 MessageQueue 取消息,如果有消息就处理消息,没有消息就阻塞。MessageQueue,就是一个消息队列,可以添加消息,处理消息。Handler 也不难,比较简单,在构造 Handler 时候内部会跟 Looper 进行关联,通过 Looper.myLooper() 获取到 Looper,找到 Looper 也就找到了 MessageQueue。在 Handler 中发送消息,其实是向 MessageQueue 队列中发送消息。