您好,匿名用户
随意问技术百科期待您的加入

android子线程调用主线程UI问题

0 投票

想修改主UI的textView,直接在子线程中调用append报错。发现可以用handle和message来解决,参考了一些网上的资料,解决了问题,但是这里想问的是handle和message在android系统里面的机制是怎么回事,谢谢?

用户头像 提问 2012年 12月1日 @ Nero 上等兵 (377 威望)
分享到:

1个回答

0 投票

1.为什么不在UI线程修改UI会出错?因为Android的UI组件不是线程安全的,所以android使用单线程模式来确保UI组件不会被不同线程在同一时间修改.FYI:Activity有runOnUiThread这个便利的方法来让代码在UI线程中执行.

2.handle和message的机制?简单地说这个叫做消息驱动机制.说详细点,首先要知道还有Looper这个类,Handler和它相对应Looper共用一个消息队列,每当我们通过Handler发送一个消息,这个消息就会被扔到消息队列里,Looper在它的线程(一般是你初始化Handler的线程,不同于你发送消息的那个线程)里会不断地看消息队列里有没有消息,有的话Looper会调用Handler的handleMessage方法来处理这个这个消息,handleMessage会在Looper的线程里执行。
你可能会奇怪,为什么你使用Handler的过程中,不用接触任何Looper。这里面有点小巧妙,Looper.prepare这个方法里,Looper会把自己(一个新对象)附加到当前线程里,这个技巧使用的就是ThreadLocal对象,所以Handler初始化的时候,就会找找当前线程有没有Looper对象,有的话设置looper并成功初始化,没有就抛出异常了.handler也可以显示地设置Looper.而Android UI本身已经帮你在UI线程绑定Looper了,所以你的Handler在UI线程了初始化,就可以一直在UI线程里处理消息.同样的,你也可以通过Looper.prepare和Looper.loop这个方法在实现自己的消息驱动线程.Looper.loop可以说是一个死循环方法,会使线程陷入没消息时就阻塞,有消息来就处理这个的循环里.

我发觉我的表达力真的很糟糕,如果要弄明白点,我的建议是看源码,这两类代码量很少的.
https://github.com/CyanogenMod/androi...

用户头像 回复 2012年 12月1日 @ Gangplank 上等兵 (314 威望)
提一个问题:

相关问题

0 投票
1 回复 29 阅读
用户头像 提问 2012年 12月1日 @ Lux 上等兵 (267 威望)
+2 投票
1 回复 195 阅读
用户头像 提问 2013年 2月4日 @ Maokai 上等兵 (292 威望)
0 投票
0 回复 92 阅读
用户头像 提问 2013年 10月10日 @ Sivir 上等兵 (275 威望)
0 投票
1 回复 33 阅读
用户头像 提问 2012年 12月1日 @ Dionysus 上等兵 (229 威望)
0 投票
1 回复 69 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...