Android在应用显示Dialog是一个非常easy事儿,但我从来没有尝试过Service里面展示Dialog。

经验UI操作要在主线程,本地的服务Service是主线程里没错,可是远程service里面显示Dialog,听起来是不是就应该没有在主线程里面了呢?

尝试一下就知道了,写了个AIDL的调用,client端去调用AIDL。在Service这边就是去显示一个Dialog。

AIDL的部分就忽略了。Service这边的代码就和Activity上显示dialog一样。

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须要有消息循环的支持,给它一个消息循环就好了呗。

可是。问题来了。。

。 这个过程发生在哪个线程上呢。后来调试发现原来每次binder调用过来都会有一个线程出现,并且还是每次都是不一样的,预计是从一个线程池里面拿的。

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

那么问题又来了,为什么显示Dialog须要looper的支持呢?

看代码:

原来Dialog有一个

 private final Handler mHandler = new Handler();

另一个

 mListenersHandler = new ListenersHandler(this);

看起来这两个Handler都是长在当前这个线程上的。那就明确了为什么show Dialog一定要looper了吧。

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

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

版权声明:本文博主原创文章,博客,未经同意不得转载。

Android 在非主线程无法操作UI意识的更多相关文章

  1. 在非主线程中更新UI

    在非主线程中调用了showMessage方法,结果报错:Can't create handler inside thread that has not called Looper.prepare() ...

  2. 后台子线程(非主线程)更新UI引起的警告

    一.问题描述 -(void)sendAsynchronousRequest { NSLog(@"%@",[NSThread currentThread]); [SVProgress ...

  3. ThreadLocal ——android消息机制handler在非主线程创建not called Looper.prepare() 错误的原因

    引用自:https://www.jianshu.com/p/a8fa72e708d3 引出: 使用Handler的时候,其必须要跟一个Looper绑定.在UI线程可直接初始化Handler来使用.但是 ...

  4. android 4.0主线程訪问网络问题

    在4.0下面,在主线程中訪问网络,假设请求超过6s的话,就会报ANR,那么这就会带来一个问题,假设网络慢或者请求的数据过大时,界面会卡顿,造成界面灵敏性非常差,因此网络请求一般不能放在主线程中操作,g ...

  5. Android中为什么主线程不会因为Looper.loop()方法造成阻塞

    很多人都对Handler的机制有所了解,如果不是很熟悉的可以看看我 如果看过源码的人都知道,在处理消息的时候使用了Looper.loop()方法,并且在该方法中进入了一个死循环,同时Looper.lo ...

  6. 在非主线程里面使用NSTimer创建和取消定时任务

    为什么要在非主线程创建NSTimer 将 timer 添加到主线程的Runloop里面本身会增加线程负荷 如果主线程因为某些原因阻塞卡顿了,timer 定时任务触发的时间精度肯定也会受到影响 有些定时 ...

  7. Android之Handler用法总结/安卓中只有主线程可以修改UI

    Handler传递消息的方式可以实现实时刷新以及长按连续响应事件. 按钮响应 btnadd_fcl.setOnTouchListener(new View.OnTouchListener() { pr ...

  8. 关于Android中为什么主线程不会因为Looper.loop()里的死循环卡死?引发的思考,事实可能不是一个 epoll 那么 简单。

    ( 转载请务必标明出处:http://www.cnblogs.com/linguanh/, 本文出自:[林冠宏(指尖下的幽灵)的博客]) 前序 本文将会把一下三个问题阐述清楚以及一个网上的普遍观点的补 ...

  9. (转)关于Android中为什么主线程不会因为Looper.loop()里的死循环卡死?引发的思考,事实可能不是一个 epoll 那么 简单。

    ( 转载请务必标明出处:http://www.cnblogs.com/linguanh/, 本文出自:[林冠宏(指尖下的幽灵)的博客]) 前序 本文将会把一下三个问题阐述清楚以及一个网上的普遍观点的补 ...

随机推荐

  1. 用友CDM系统期初导入商品资料经验

    1.       倒入商品资料,是导入表spkfk(商品档案表).spkfjc(商品总结存表),主要是将spkfk全部编码导入. 2.       导入客商资料,是导入表mchk(业务单位登记表).m ...

  2. Mercurial简介

    前言     目前所在的公司的版本控制使用的是Mercurial,它也有一个对应的客户端小乌龟,但是Mercurial跟我们之前使用的SVN有着本质的区别,对于其区别会在下一篇中介绍到,这次主要是带领 ...

  3. Andriod开发之浏览器开发(WebView)

    1.创建一个WebView在XML文件 <WebView android:id="@+id/webView" android:layout_width="match ...

  4. hadoop的一些名词解释

    在网上收集了一些mapreduce中常用的一些名词的解释,分享一下: Shuffle(洗牌):当第一个map任务完成后,节点可能还要继续执行更多的map 任务,但这时候也开始把map任务的中间输出交换 ...

  5. android LinearLayout等view如何获取button效果

    我们可以给LinearLayout以及一切继承自View的控件,设置View.onClickListener监听,例如LInearLayout. 但是我们发现LinearLayout可以执行监听方法体 ...

  6. Mysql学习笔记(一)数据类型

    原文:Mysql学习笔记(一)数据类型 学习内容: Mysql基本数据类型. 1.数字类型.. i.整型     Mysql数据类型             含义(有符号)     tinyint(m ...

  7. windows phone (26) ApplicationBar应用程序栏

    原文:windows phone (26) ApplicationBar应用程序栏 在应用程序中,如果需要几个按钮或者菜单来执行一些普通的命令,就应该考虑使用ApplicationBar,因为silv ...

  8. Windows Phone开发(26):启动器与选择器之MediaPlayerLauncher和SearchTask

    原文:Windows Phone开发(26):启动器与选择器之MediaPlayerLauncher和SearchTask 启动器与选择器简单的地方在于,它们的使用方法几乎一模一样,从前面几节中,我相 ...

  9. java线程学生进实训室

    Instructor: Dr. Simina FlutureCSCI 34 CSCI 34 CSCI 34CSCI 34 0 Summer 201 ummer 201 ummer 201ummer 2 ...

  10. poj 2586 Y2K Accounting Bug (贪心)

    Y2K Accounting Bug Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8678   Accepted: 428 ...