首页 > android子线程调用主线程UI问题

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

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


handle和message简单来说,就是一个异步的事件通知回调


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...

【热门文章】
【热门文章】