Handler基础知识及使用

Handler基础知识

Handler主要接受子线程发送过来的数据,并用此数据配合主线程更新UI

 

当应用程序启动时,Android首先会开启一个主线程(UI线程),主线程管理界面中的UI控件,进行事件分发。例如,点击一个ButtonAndroid会分发事件到Button上,来响应点击事件。如果需要进行一个比较耗时的操作,例如联网读取数据、读取本地一个较大的文件等,则不能把这些操作放在主线程,否则会出现假死的现象。如果UI线程中的操作在5秒钟内还没有完成的话,就会收到Android系统的一个“强制关闭”的错误提示。为了避免出现这样的问题,需要把这些耗时的操作放在子线程中进行,因为子线程中涉及UI更新的操作,所以Android的主线程不是线程安全的,也就是说,更新UI操作只能在主线程中进行,子线程中禁止对UI进行操作。Handler就是为了解决这样的问题,因为Handler运行在主线程中(也可以运行在子线程中),它与子线程通过Message对象来传递数据,Handler承担着接受子线程传来的(子线程通过调用sendMessage()方法)Message对象,然后把这些消息放入主线程的消息队列中,配合主线程进行更新UI的操作。

 

Handler类允许发送消息、runnable对象和处理消息队列中的消息。每一个Handler实例都与一个线程和该线程的消息队列绑定在一起,可以发送消息和runnable对象给该消息队列,并在消息队列出口处处理它们。

 

Handler类有两种主要用途:按照时间规划,在将来某一个时刻,处理某一条消息或执行某一个runnable对象;把一个对另外线程对象的操作请求放入到消息队列中,从而避免线程之间的冲突。

 

Handler类常用函数:

post(Runnable);

postAtTime(Runnable, long);

postDelayed(Runnable, long);

sendEmptyMessage(int);

sendMessage(Message);

sendMessageAtTime(Message, long);

sendMessageDelayed(Message, long);

post*之类的函数可以传输一个runnable对象给消息队列,并在到达消息队列之后被调用;send*之类的函数可以传输一个Message对象,该Message对象可以被Handler类的handleMessage(Message)方法处理。

post*之类的函数和send*之类的函数都可以执行消息的执行时机,是立即执行、稍后执行、还是在某一个确定时刻执行,这可以用来实现超时、消息或其它时间相关的操作。

 

来自网络

posted on 2013-01-27 12:52  大大森林  阅读(207)  评论(0)    收藏  举报