[问题] handeler VS method 改UI thread的差异?

楼主: ntuleo (里欧)   2015-03-20 16:59:27
我们都知道要开一个thread去改UI的话是不行的,需要用handler机制把thread用
sendmessage的方式回call main thread的handle message才能修改
这边有个疑问是
这样跟直接用method在main thread中修改UI有什么差异呢?
因为用handler新开的thread虽然是在后台跑
但是回call回来还是block住main thread不是吗? 这样跟用method有什么不同呢?
作者: hellogg1 (安卓嫩嫩工程师)   2015-03-20 17:07:00
所以你不能在main thread做耗时的事情否则会ANR
作者: issuemylove (NotLove)   2015-03-20 17:28:00
UI的修改前,可能会有大量的计算 大量计算跑在main下略 你懂的
楼主: ntuleo (里欧)   2015-03-20 19:42:00
大量计算开thread,修改UI再call method这样不使用handler也可以达到handler改UI的效果不是吗?不了解的点是两种方法都会block main thread,那为什么需要用比较麻烦的handler呢?
作者: sdyy (中坜市的小智)   2015-03-20 20:32:00
怎么会一样 例如你要加载一张网络图片 把图片载好花1秒用main thread跑 你这一秒都被卡住 而另开thread 则只要指定载好的图片 内存都已摆好也就不会block到其他UI画面
作者: corrupt003 (QQ)   2015-03-20 20:43:00
call method 在thread 底下做的话,还是跑在thread阿会用handler是因为一般情形下handler是绑ui thread
作者: ssccg (23)   2015-03-20 20:48:00
call回来是在main thread的message queue上排程,不会直接block main thread,会block就是你用错了handler是把message queue包装起来用,跟开thread是两回事
作者: corrupt003 (QQ)   2015-03-20 20:51:00
所以有复杂计算在thread做,做完需要改ui时用handler,handler里 call method才会在 ui thread 更新ui
作者: ssccg (23)   2015-03-20 20:52:00
你看起来跟thread不太熟,直接call method是在同一个thread
楼主: ntuleo (里欧)   2015-03-20 21:57:00
感谢大家,我目前的理解是这样的handler诞生的主要原因是主线程要和子线程沟通用的一般thread做不到这一点所以比较heavy的工作放在thread做,要改ui再用handler通知main thread修改但今天如果只是简单的setText,那其实直接call就可以了开thread再用handler call和直接call在这是没有区别的因为中间没有复杂的运算
作者: qweqweqweqwe (4qwe)   2015-03-20 22:00:00
是阿.. 所以这种就直接setText 就可以了阿..
作者: ssccg (23)   2015-03-20 22:26:00
有什么不同你试一下就知道,只有在main thread才可以改UI直接call你会得到一个CalledFromWrongThreadException
作者: ckvir (ckvir)   2015-03-22 03:10:00
回call回来又不会block住
作者: KeySabre (KeySabreur)   2015-03-23 18:08:00
main thread已经很忙,要更新UI,又要处理touch event、key event等,如果用来处理其他事情,使得画面无法即时更新,触控事件无法即时处理,操作就会卡顿,人眼认为fps 30是顺畅;另外我记得系统每16ms会draw一次,阻碍到就会感觉不顺畅。Android有ANR机制保护,可让使用者强制关闭程序,避免main thread被恶意占用使得手机被绑架。另外broadcast receiver, service等也要注意,他们在系统内也有对应的回应时间控制。Handler是Android提供让你做异步调用的机制所含的一个类别,大致上就是你可以开一个thread然后放Looper.prepare(),Looper会给这个thread一个message queue并且用循环去取,Handler必须与Looper搭配,当有message时就会发到Handler的handleMessage()。Handler的无参数建构子会用当前thread的looper,所以你在main thread创handler,就能利用main thread本来就有的looper,当你从其他thread发送讯息给这个handler时,最终就可以在main thread处理这个讯息。如果要给别的thread一个handler,用法前面说过了,不然也可直接利用HandlerThread这个类别。

Links booklink

Contact Us: admin [ a t ] ucptt.com