发表于: 2018-10-21 23:28:53
0 758
一、今天完成的事情
在子线程中更新UI
Android的异步消息处理机制
Android不允许在子线程中执行更新UI的操作,只能在主线程中执行更新UI,否则会出现异常,但有时候一些耗时操作必须在子线程中进行,完后需要根据结果来更新相应的UI,比如在子线程中执行下载文件这个操作,下载完成后需要弹出一个Toast提示用户下载完成了,这时候就需要用到Android的异步消息处理机制。
Android的异步消息处理机制主要分为四个部分:Message、Handler、MessageQueue、Looper。
(1)Message
Message(消息),是线程之间传递的消息,除了作为消息被传递,它的内部还可以携带少量的信息用于
线 程之间交换数据。
(2)Handler
Handler主要用于发送和处理消息,Handler的sendMessage()方法发送消息,使用handleMessage()
方法接收并处理消息。
(3)MessageQueue
MessageQueue(消息队列)用于存放所有经Handler返送出来的消息,所有的消息会在消息队列中排队等待被处理,每个线程只能有一个MessageQueue对象。
(4)Looper
Looper是MessageQueue中的管理者,调用loop()方法后,Looper会进入到一个无限循环的状态,一旦发现MessageQueue中有消息来排队了,就会把消息取出来,然后传递到Hanler的handleMessage()方法中,每个线程只有一个Looper对象。
总结异步消息的主要流程:在主线程中创建一个Handler对象,重写handleMessage()方法,当子线程需要执行更新UI的操作时,就创建一个Message对象——消息,通过Handler将消息发送出去,消息会被加入到子线程的MessageQuieue的队列中等待被一直在循环的Looper取走,Looper将消息传回Handleer的
handleMessage()方法中,handleMessage()里有相应的更新UI的具体操作。简单来讲,子线程需要更新UI时,就会派一个跑腿的(message)去通知主线程,跑腿的可能会有很多个,所以他们会在子线程的MessageQueue里排队等待,Looper是MessageQueue里的管理员,他一直在MessageQueue里转悠,发现一个跑腿的就把他带到主线程的Hnadler里,跑腿的告诉handler子线程想要更新UI,然后Handler就会派一个对应的
handlerMessage()去执行UI更新。
归根到底,执行更新UI的操作还是在主线程中完成的。
private static class MyHandler extends Handler {
private final WeakReference<SetAddressFragment> mFragment;
public MyHandler(SetAddressFragment mFragment) {
this.mFragment = new WeakReference<SetAddressFragment>(mFragment);
}
@Override
public void handleMessage(Message msg) {
if (mFragment.get() == null) {
return;
}
switch (msg.what) {
case DATABASE_OK:
showProvince();
break;
default:
break;
}
}
}
创建Handler对象
private MyHandler mHandler = new MyHandler(this);
子线程发送消息通知主线程更新UI
mHandler.sendEmptyMessage(DATABASE_OK);
二、明天计划的事情
选择一个第三方分享平台,查看文档,集成开发环境。
三、遇到的问题
四、收获
异步消息处理机制。
评论