国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 互联网 > Android 关于非主线程不能操作UI的认识

Android 关于非主线程不能操作UI的认识

来源:程序员人生   发布时间:2014-11-07 09:11:54 阅读次数:3341次

Android在利用里显示Dialog是个很简单的事情,但是1直没试过在Service里面显示Dialog。根据之前的经验UI操作要在主线程,本地的服务Service是主线程里没错,但是远程service里面显示Dialog,听起来是否是就应当没有在主线程里面了呢?

        尝试1下就知道了,写了个AIDL的调用,client端去调用AIDL,在Service这边就是去显示1个Dialog。AIDL的部份就疏忽了。Service这边的代码就和Activity上显示dialog1样。

AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setTitle("TEST"); builder.setMessage("test"); builder.show();

固然dialog要setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

结果呢,悲剧了。

Can't create handler inside thread that has not called Looper.prepare()
甚么意思呢,主观理解,要显示个Dialog需要有消息循环的支持,给它1个消息循环就行了呗。但是,问题来了。。。 这个进程产生在哪一个线程上呢,后来调试发现原来每次binder调用过来都会有1个线程出现,而且还是每次都是不1样的,估计是从1个线程池里面拿的。

那怎样给这个线程加上looper呢,没办法只能自己开1个线程了,果然在1个带looper的线程里去显示dailog貌似就没问题了。


那末问题又来了,为何显示Dialog需要looper的支持呢?

看代码:

原来Dialog有1个

private final Handler mHandler = new Handler();
还有1个

mListenersHandler = new ListenersHandler(this);
看起来这两个Handler都是长在当前这个线程上的,那就明白了为何show Dialog1定要looper了吧。


最后还有1个问题,1直说UI操作必须要在主线程,那上面说的这个情况就有点奇怪了,显现Service是远程的,显示dialog又是Service的1个子线程,跟主线程有半毛钱关系吗?费解了,以我个人理解,这个非主线程不操作UI看来其实不是绝对的吧。

再仔细想一想,之前有看到过,其实不管是Dialog还是Acitivty本质上都是通过WindowManager往window上加了1个view(ViewRoot),所有的view不多是只属于1个client,各个client都在这个window上分了1杯羹,那末,有多个线程会去更新各自的view也就不奇怪了。只是每个View本身只能有1个线程来操作罢了。这就是我对非主线程不能操作UI的认识,不知道是否是正确。









生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生