目录
Handler的执行流程
说白了就是子线程调用了主线程的某对象的方法,通过这个运行在主线程的对象,就能够对UI界面进行更新。
自己也可以实现,不过Handler更为专业的对象,已经写好了。
相关名词解析
UI线程、Handler、Message、Message Queue、Looper。
- UI线程:就是我们的主线程,系统在创建UI线程的时候会初始化一个Looper对象,同时也会创建一个与其关联的MessageQueue。如果执行一个超过5秒的未完成的任务,程序将弹出dailog窗口显示无响应,强制关闭。
- Handler:负责消息的发送与接收并处理。如果希望Handler正常工作,在当前线程中要有一个Looper对象。
- Message:Handler接收与处理的消息对象。此对象有 4个成员变量:arg1和arg2是整型, what用户定义的消息代码, obj接收任意类型的对象。
- MessageQueue:消息队列,用来存放通过Handler发布的消息,按照先进先出管理Message,在初始化Looper对象时会创建一个与之关联的MessageQueue。
- Looper:每个线程只能够有一个Looper,管理MessageQueue,Looper会死循环取出Message Queue的非Null Message传递给Handler并设置此Message为Null。Main线程会自动创建Looper,子线程不会自动创建Looper,需要手动创建。
Looper.getMainLooper()得到的是主线程的Looper对象,Looper.myLooper()得到的是当前线程的Looper对象。
Handler相关常用方法
- void handleMessage(Message msg):处理消息的方法,通常是用于被重写!
- sendEmptyMessage(int what):发送空消息
- sendEmptyMessageDelayed(int what,long delayMillis):指定延时多少毫秒后发送空信息
- sendMessage(Message msg):立即发送信息
- sendMessageDelayed(Message msg):指定延时多少毫秒后发送信息
- final boolean hasMessage(int what):检查消息队列中是否包含what属性为指定值的消息 如果是参数为(int what,Object object):除了判断what属性,还需要判断Object属性是否为指定对象的消息
Handler写在子线程中
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare(); // 创建本线程的Looper并创建一个MessageQueue
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop(); // 开始运行Looper,监听Message Queue
}
}
子线程更新UI
Android在子线程更新UI的7种方法
Message8种构造方法