网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

Android消息机--handler的自我总结

  大家都知道Handler是Android为了能在子线程更新UI所创作出来的一个类.

成都创新互联公司专注于万山网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供万山营销型网站建设,万山网站制作、万山网页设计、万山网站官网定制、微信小程序开发服务,打造万山网络公司原创品牌,更为您提供万山网站排名全网营销落地服务。

那么为什么Handler能在handler里面能更新UI。是因为Handler 把更新UI的操作切换到了主线程来操作.

有些博客说Handler是线程之间的一种通讯方式,这只局限于子线程跟主线程之间,

那么子线程是怎么把消息传送到主线程来操作,这其中一个关键的地方就是Looper.

从例子我们可以知道 假如现在有一段主要的代码

oncrete(){

new Thread(new Runnable(){

run{

//进行UI操作  ---这样是会报错的 那么我们加上handler

// 之前是没有的,现在加上Looper 

Looper.prepare();

new Handler(){

handlerMessage(){

//进行UI操作 --- 

// 如果是这样依然会报错 因为子线程中现在还没有Looper,会报没有Looper那个错误信息(从源码可以看到加了Looper检测)  那么我们加上Looper

}         

}

Looper.loop();

}

}).start;

}

从上面的代码中 加了Looper之后还是会报错,报应该在主线程中执行UI操作.

那么是为什么,原因在于 这个Looper不是主线程的Looper 

一个解决方法是 把Looper.prepare();改成Looper.getMainLooper();

或者 new Handler(Looper.getMainLooper);

这样就可以更新UI不会报错了,

那么Looper是怎样把更新UI的操作切换到主线程 

我们从源码可以看到 当我们new Handler(Looper.getMainLooper())的时候 里面有

Handler(Looper looperCallback callbackasync) {
    = looper= looper.mQueue= callback= async}

所以说这个时候 handler已经拿到了主线程的Looper;

然后我们在Looper的loop();方法里面看到

{
    msg.target.dispatchMessage(msg)} {
    (traceTag != ) {
        Trace.(traceTag)}
}

会调用msg.target 这个msg.target是在这里拿到

Looper me = ()(me == ) {
    RuntimeException()}
MessageQueue queue = me.mQueue
() {
    Message msg = queue.next()(msg == ) {
        }

在loop()方法里面Looper会开始无限循环 去处理信息啦。

顺序是以下这样

1:实例化Activity 的时候创建ActivityThread(主线程) 然后在Main()里面创建Looper 然后Looper里面通过mThreadLocal 的set方法保存主线程 

然后再调用Looper.loop();这时候会开启无限循环

2:Looper.getMainLooper 会调用get方法 这个时候就拿到了主线程的Looper 以及里面保存的messageQueue 

然后 handler调用post 其实也就是在主线程的messageQueue上插入一个信息

那么loop 方法里面就检测到了,这时候已经是切换到主进程了.

看源码比较能清晰整个流程


网页名称:Android消息机--handler的自我总结
本文路径:http://bjjierui.cn/article/jioeeg.html

其他资讯