Day10 Handler
- Handler
Handler
线程之间发送消息
主线程不能执行耗时操作
子线程不能操作主线程UI视图
- Handler核心类
- Handler发送消息的两种方式
- 实例:主线程向子线程发送消息
Handler核心类
Message
:对发送消息的封装MessageQueue
:消息队列Looper
:可以循环读取消息(从MessageQueue中)Hnadler
:处理消息,同时也发送消息
谁接收消息,handler定义在谁的线程中
Handler发送消息的两种方式
- 使用 sendMessage(Message msg)方式
- 使用 post(Runnable r)方式
//使用sendMessage方式传递数据
Message msg=Message.obtain();
msg.obj;
msg.arg1;
msg.arg2;
msg.what;
msg.setData(Bundle bundle);
sendMessage(Message msg);
//在handler定义中通过重写handleMessage()方式直接接收并处理数据
handleMessage(Message msg);
//通过post方式传递任务
handler.post(new Runnable(){
@Override
public void run() {
//TODO
}
});
//任务提交给主线程后会由主线程去执行
主线程向子线程发送消息
==理解handler原理==
非常重要
private void sendMessage(View v){
//点击按钮给子线程发消息
Message msg=Message.obtain();
msg.obj="hello!";
handler.sendMessage(msg);//把Msg放入Handler内部的MessageQueue对象中,这个对象同时也是Looper中的MessageQueue
//在Message类中有一个Hnadler 类型的Callback对象,当发送消息时,这个对象被赋值为发送的Hnadler
}
//创建子线程
class MyThread extends Thread{
@Override
public void run() {
//子线程中没有Looper对象
//需要先有Looper对象
Looper.prepare();//回去现成的本地变量中查找,如果有Looper,得到,否则new 一个Looper,并加入本地变量
//在Looper创建的同时创建并绑定了MessageQueue()(使用同一个消息队列)
//实例化handler
//同时实现与Looper的绑定
handler=new Handler();//如果直接实例化Hnadler,会出现RuntimeException,原因是子线程中没有Looper对象
//让Looper对象循环读取,当读到消息时会去掉用 msg.target.dispatchMessage(msg);
Looper.loop();
}
}