Handler 是 android 提供的对于异步消息处理的方案。 Handler 的特点是与调用者处于同一线程,如果 Handler 里面做耗时的动作,调用者线程会阻塞。 Android UI 操作不是线程安全的,并且这些操作必须在 UI 线程中执行。 Handler 的 post 对线程的处理也不是真正 start 一个新的线程,而是直接调用了线程的 run 方法。
所以, Handler 经常被用来在另外的线程中更新 UI 界面。因为 UI 操作必须在 UI 线程中完成,可以通过 Handler 在别的线程中向 UI 线程发送刷新消息, UI 线程收到消息后执行相关操作。主要用到下面两个函数:
public final boolean sendMessage (Message msg) 发送消息
public void handleMessage(Message msg) 处理消息
Handler 对于 Message 的处理不是并发的。一个 Looper 只有处理完一条 Message 才会读取下一条,所以消息的处理是阻塞形式的。
通过 Handler 类,还可以提交和处理一个 Runnable 对象。这个对象的 run 方法可以立刻执行,也可以在指定时间后执行(也可称为预约执行)。 Handler 类主要可以使用如下 3 个方法来设置执行 Runnable 对象的时间:
public final boolean post(Runnable r);
立即执行 Runnable 对象。
public final boolean postAtTime(Runnable r, long uptimeMillis);
在指定的时间( uptimeMillis )执行 Runnable 对象
public final boolean postDelayed(Runnable r, long delayMillis);
在指定的时间间隔( delayMillis )执行 Runnable 对象
需要注意的是,不管使用哪个方法来执行 Runnable 对象,都只能运行一次。如果想循环执行,必须在执行完后再次调用 post 、 postAtTime 或 postDelayed 方法。
要停止执行 Runnable 对象,使用 removeCallbacks 方法:
public final void removeCallbacks (Runnable r) ;