一:背景
Handler:是一个消息分发对象,进行发送和处理消息,并且其 Runnable 对象与一个线程的 MessageQueue 关联。
作用:调度消息,将一个任务切换到某个指定的线程中去执行。
为什么需要 Handler?
子线程不允许访问 UI
假若子线程允许访问 UI,则在多线程并发访问情况下,会使得 UI 控件处于不可预期的状态。
传统解决办法:加锁,但会使得UI访问逻辑变的复杂,其次降低 UI 访问的效率。
引入 Handler
采用单线程模型处理 UI 操作,通过 Handler 切换到 UI 线程,解决子线程中无法访问 UI 的问题。
二:使用
private final int MESSAGE_ONE = 0x0001;
private final int MESSAGE_TWO = 0x0002;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case MESSAGE_ONE:
String str = (String) msg.obj;
Log.d("Test","msg附带的参数str为" + str);
Log.i("Test","这里可以做一些UI操作等");
break;
case MESSAGE_TWO:
//...
break;
}
}
};
在需要使用的地方:
String str = "需要传过去的参数";
Message msg = Message.obtain();
msg.what = MESSAGE_ONE;
msg.obj = str;
handler.sendMessage(msg);
另外注意的是:
/*1、message由handler创建,可直接向handler发送消息。msg.sendToTarget()*/
Message msg = handler.obtainMessage();
msg.arg1 = i;
msg.sendToTarget();
/*2、message通过new的方式创建,可用handler.sendMessage(msg)来发送消息*/
Message msg=new Message();
msg.arg1=i;
handler.sendMessage(msg);
//直接调用 handler 的发送消息方法发送消息。
/* 3、message通过Message.obtain的方式创建,可用sendMessage(msg)来发送消息 */
Message msg= Message.obtain();
msg.arg1=i;
handler.sendMessage(msg);