由于android制定的规则:只运行ui线程修改activity里的ui组件。
这样新启动的线程就无法修改界面的属性,这样如果需要在新启动的线程里改变界面属性,就需要利用Handler的消息机制来做。
Handler做的事情:1、在新启动的线程里发送消息。2、在ui主线程里接收,处理消息。
MessageQueue:消息队列。
当新启动的线程发送消息,消息会送到和它关联的MessageQueue中,Handler会不断的从队列中获取消息并处理(回调消息处理方法)
void handleMessage(Message msg)处理消息、用于被重写
final boolean sendMessage(Message msg)立即发送消息
final boolean sendMessageDelayed(Message msg,long delayMillis)指定多少毫秒后发送消息
例如在一个activity里
final Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
//如果消息的what属性为123
if(msg.what==123)
{
//修改ui操作
//...code
}
}
};
new Timer().schedule(new TimeTask()
{
@Override
public void run()
{
//发送空消息
handler.sendEmptyMessage(123);
}
},0,1000);
Message:Handler接收和处理的对象
Looper:每个线程中中能拥有一个Looper,负责读取消息队列中的消息,交给Handler处理
消息队列采用先进先出的方式。
Looper对象无法通过构造器创造,初始化Looper时会创建一个与之关联的MessageQueue。
消息队列由Looper管理,Handler的正常工作依赖Looper。
1)ui主线程,Looper由系统自动创建
2) 自己创建的子线程,需要手动创建Looper对象,并启动。创建后调用prepare方法(确保每个线程中只有一个Looper对象),
loop方法来启动它。
PS:
Looper.prepare();//创建线程唯一的looper
//....code Handler处理;//创建Handler,重写消息处理函数
Looper.loop();//启动looper
PS:Looper的loop方法通过死循环方式不断从MessageQueue中取消息。
PS:不要在ui线程进行耗时运算,有可能引起ANR异常,耗时运算启动新线程运算,ui线程负责响应交互。