Handler基础知识及使用
Handler基础知识
Handler主要接受子线程发送过来的数据,并用此数据配合主线程更新UI。
当应用程序启动时,Android首先会开启一个主线程(UI线程),主线程管理界面中的UI控件,进行事件分发。例如,点击一个Button,Android会分发事件到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*之类的函数都可以执行消息的执行时机,是立即执行、稍后执行、还是在某一个确定时刻执行,这可以用来实现超时、消息或其它时间相关的操作。
来自网络
浙公网安备 33010602011771号