Android规定只允许UI线程修改Activity里面的UI组件,如果我们要在子线程中去执行更改UI的操作,会导致UI操作的线程不安全,就会报错。所以我们就要用到Hanlder消息机制
消息机制的使用:
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 100:
Toast.makeText(MainActivity.this,"",Toast.LENGTH_SHORT).show();
break;
}
}
};
然后在需要进行进行弹 Toast的地方发送消息 调用如下方法:
mHandler.sendEmptyMessageDelayed(100,200);
Handler机制的相关概念
Message(消息)
定义:Handler接收和处理的消息对象(Bean对象)
作用:通信时相关信息的存放和传递
ThreadLocal
定义:线程内部的数据存储类
作用:负责存储和获取本线程的Looper
MessageQueue(消息队列)
定义:采用单链表的数据结构来存储消息列表
作用:用来存放通过Handler发过来的Message,按照先进先出执行
Handler(处理者)
定义:Message的主要处理者
作用:负责发送Message到消息队列和处理Looper分派过来的Message
Looper(循环器)
定义:扮演MessageQueue和Handler之间桥梁的角色
作用: 消息循环:循环取出MessageQueue的Message
消息派发:将取出的Message交付给相应的Handler
他们之间的关系:
Looper中存放有MessageQueue,MessageQueue中又有很多Message,当我们的Handler发送消息时,会获取当前的Lopper,并将消息存放到当前Lopper的MessageQueue中。而MessageQueen也会在Looper的带动下,(Looper.loop()方法)一直循环的读取Message信息,并将Message信息发送给Handler,并执行HandlerMessage()方法
注意:Looper存在在主线程,而且只有唯一的一个 MessageQueue也是只有一个存在在主线程 通过查看源码可以知道 在创建Looper的实例的时候,会自动创建一个与之配对的MessageQueue
looper的退出方式
1、quit():quit会直接退出Looper
2、quitSafety():quitSafety只是设定一个退出标记,然后把消息队列中的已有消息处理完毕后退出Looper
Handler发送消息:
1、sendMessage(Message msg);
2、post(Runnable r);
Handler处理消息:
post()方法的处理方法就是将传进来的Runnable执行run()方法
sendMessage()方法的处理方法就是执行handleMessage()空方法,这也是我们为什么要在Handler重写这个方法的原因
网友评论