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. It's only too late if you decide it is. Get busy living, or get busy dying(转)

    我们的身边是不是有这样的一群人,他们心肠不坏,容易感伤,但吐槽似乎是常有的事情,看着时下电视电影,说起哪些哪些自己的泪点.一般都是吃货,别人失眠的时候,TA可能在回忆自己刚做了什么梦.我不是要去评论这 ...

  2. swift-辞典NSDictionary定义,变化的关键,删/加入关键

    // Playground - noun: a place where people can play import UIKit //--------------------------------- ...

  3. CSS预处理器——Sass、LESS和Stylus实践

    CSS(Cascading Style Sheet)被译为级联样式表,做为一名前端从业人员来说,这个专业名词并不陌生,在行业中通常称之为“风格样式表(Style Sheet)”,它主要是用来进行网页风 ...

  4. 【牛刀小试2】password保

    ]password保 主要知识: 1.        while循环 2.        do-while循环 3.        if-else 4.        strcmp()函数 [充电一下 ...

  5. HDU 1695 GCD 欧拉函数+容斥原理+质因数分解

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:在[a,b]中的x,在[c,d]中的y,求x与y的最大公约数为k的组合有多少.(a=1, a ...

  6. Maximal Square 我们都在寻找最高1子矩阵(leeCode)

    Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and ret ...

  7. Android 导入第三方jar时 出现ClassNotFoundException

    处理方式: 1.首先检查有没有正确的导入该jar和有没有重复导入该jar. 2.如果没有出现1的问题,那么在buildpath->order and export 中将你导入的jar左边的复选框 ...

  8. JAVA环境配置---------jdk安装路径中存在空格的问题

    我把jdk 安装在C:\Program Files下 而ide启动脚本 startup.bat 例如以下: if "%OS%"=="Windows_NT" se ...

  9. 使用bootbox.js(二级务必提交书面和数字到数字中国)

    页面文件 <#-- 页头 --> <#assign currNav = "deposit"> <#assign title="网校充值&qu ...

  10. Android - 支持不同的设备 - 支持不同的平台版本

    在最新版本的Android为app提供很好的新API时,也应该继续支持旧版本的Android直到大部分设备已经更新了.这里将要介绍如何在使用最新API带来的优点的同时继续支持老版本. Dashboar ...