昨天刚看了Handler和HandlerThread这个东西,不明白为什么要用这么复杂的东西,而且Handler直接post的话好像还不是子线程运行。那我再开发的时候直接用Thread行不行?两个有什么区别?
解决方案 »
- 怎么访问assets文件夹下的数据库文件???
- android 如何从 3.55mm耳机接口 读取数据,功能 有些类似于Square
- Intent.ACTION_SEND时启动指定的Activity
- 如何在Activity的子线程内调用startActivity()打开另一Activity?
- ContentResolver 和 ContentProvider 的关系问题。
- opencore里面如何出LOGV!?
- 关于安卓画布类
- MonkeyRunner怎么实现图案解锁呢?
- 想做个在线升级,前辈们给个思路?
- eclipse logcat一直无限期打印输出
- 如何调用系统gallery打开指定文件夹中的图片
- VideoView 显示问题。
如果不对,楼下的correct me
还是有些不明白,意思是如果我自己写一个线程,把UI传进去,那再新线程中是不能操作UI的?
另外,如果我不操作UI,只是做一些其他的后台操作,能否用Thread而不用Android提供的Handler?
2. 如果不操作UI,可以只用Thread
1,在线程中直接调用UI中的方法来更新UI,这时会报错,因为Android是非线程安全的,因为子线程在更新UI的同时主线程也可能在更新UI,这样的话因为是非线程安全因此可能会出错,所以Android规定不可在子线程中执行更新UI的操作。
2,子线程可以发送消息(sendMessage)给主线程,由主线程自己更新自己,这就用到Android的Handler消息管理机制了。具体Handler的用法网上很多。
当然如果线程中没有UI操作那就不需要发送什么消息给主线程了。
与Handler完成相同功能的还有AsyncTask,是Android提供的一个异步类,它在执行完线程操作后会直接跳回主线程,用法网上很多。
你要使用多线程可以直接用Thread 然后thread.start
但是HandlerThread是重新启动线程和handler不一样,可以说和thread起到同样的功能
情况2:如果线程里面需要更改UI,那就要用到handler,利用handler传送消息.
理解Handler最好是要结合Looper和MessageQueue。
handler的发送message和task只是往某一个looper的MessageQueue注入一项。
Looper是和thread结合的,就是一个事件循环。当该线程回到其事件循环时,之前注入的项就会得到执行。
至于在哪个线程里执行,要看handler发送到哪个线程的looper了,创建handler时都会绑定一个looper(ui线程是自动绑定的),handler发送的message等都会在该looper的线程得到处理。
如果你有Qt的开发经验就很容易理解,这跟Qt的信号槽几乎是如出一辙。
如果你不需要跟UI线程进行交互的话是可以用thread的啦~