201709013工作日记--Android消息机制HandlerThread

关山初度尘未洗,策马扬鞭再奋蹄!这篇文章主要讲述201709013工作日记--Android消息机制HandlerThread相关的知识,希望能为你提供帮助。
【201709013工作日记--Android消息机制HandlerThread】1.首先来看一个常规的handler用法:
在主线程中建立一个handler:

private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: mTestTV.setText("This is handleMessage"); //更新UI break; } } };

 
在子线程中进行耗时操作,结束后发送消息,主线程收到消息后进行更新UI操作。
new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); //在子线程有一段耗时操作,比如请求网络 mHandler.sendEmptyMessage(0); } catch (InterruptedException e) { e.printStackTrace(); } } }).start();

 
2.现在来看看handler.post()的版本:
private Handler mHandler; //全局变量 @Override protected void onCreate(Bundle savedInstanceState) { mHandler = new Handler(); new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); //在子线程有一段耗时操作,比如请求网络 mHandler.post(new Runnable() { @Override public void run() { mTestTV.setText("This is post"); //更新UI } }); } catch (InterruptedException e) { e.printStackTrace(); } } }).start();

 
耗时操作完成之后,直接在handler开启的子线程中进行了更新UI的操作。post和sendMessage原理都是封装成Message,并且最终都调用了enqueueMessage()一个无限循环将消息加入到消息队列中(链表的形式)。翻看MessageQueue的方法,我们找到了next(),代码太长,不赘述,我们知道它是用来把消息取出来的就行了。不过这个方法是在什么地方调用的呢,不是在Handler中,我们找到了Looper这个关键人物,我叫他环形使者,专门负责从消息队列中拿消息。参考博客:http://blog.csdn.net/ly502541243/article/details/52062179/
 

    推荐阅读