关于坑爹的PopupWindow的“阻塞”争议问题:Android没有真正的“阻塞式”对话框
请先允许我对网上某些没经过亲自实践人云亦云的同志呵呵。。。
那么开始正文,首先“阻塞”这个词本身就存在理解上的差异!
一般我们理解的阻塞,是阻塞了某个线程,即代码执行到这里后等待这个函数块执行完毕,才能继续向下运行。比如常见的控制台输入函数,必须要求用户输入一个值才能继续,否则等待。
而在Android里,一部分人对阻塞做了另外的解释:锁死了其它UI,只有当前这个模块可以被响应。具体什么意思呢?比如原本点击屏幕,会弹出一个Toast。那么好,现在我弹出一个UI,用户只能在这个UI操作,他再去点击这个UI外围的屏幕,将触发不了“弹出Toast”这个事件,那么就认为这个UI“阻塞”了应用。
好,现在我们着重分析第二种看法。乍一看貌似没问题,原本应该执行的操作,因为另一个操作没结算完毕而不能发生,这不就是“阻塞”了么?然而事实是,这种“阻塞”实质上只是屏蔽了控制弹出Toast的代码块的触发条件:点击UI。准确的说,是把点击UI这个操作给截获了。但如果这个事件是在这个线程里顺序执行的,他并不需要事件驱动呢?想要测试也很简单,探出一个PopupWindow,紧接着在下面(不是某个UI的监听器里)写一个Log.v();呵呵哒,看到了吧,不等你关掉弹窗,Log.v里面的内容已经被打印了。。。
可见,PopupWindow的“阻塞”,其实只是一种屏蔽。它仅仅是使得其它控件不可被操作罢了。说它是“阻塞的”,没问题,就是容易误导;但说它是“线程阻塞”的就呵呵了。另外面对这个问题,网上还有一种退而求其次的建议:把要做的东西放到onClick();里面。这样也能一定程度的解决问题,但需要把原本连贯的一个过程拆分开。虽然不可否认,这本就更符合Android的设计框架的思想,但如果是在流程已经设计好了,无法改动的情况下就行不通了。
总结:PopupWindow的”阻塞”并不能使你的线程wait。它完全取得了用户操作的响应处理权限,从而使其它UI控件不被触发,仅此而已。无论AlertDialog还是PopupWindow,都不能做到传统意义上的线程阻塞。想要根据用户的某个操作来决定程序流程(否则不继续执行),只能把主线程wait掉。但这样会导致ANR,所以取巧的方法是while([某个值没有被改变]) sleep(100);是的,间歇性sleep主线程,告诉Android,咱每100ms有一次响应,你别给我ANR了啊。
附上我的小游戏的源码链接,就是在这里面遇到的问题: GitHub
关于坑爹的PopupWindow的“阻塞”争议问题:Android没有真正的“阻塞式”对话框的更多相关文章
- 阻塞、非阻塞的概念和select函数的阻塞功能
其它文档: http://www.cnitblog.com/zouzheng/archive/2010/11/25/71711.html (1)阻塞block 所谓阻塞方式block,顾名思义 ...
- Linux 设备驱动--- 阻塞型字符设备驱动 --- O_NONBLOCK --- 非阻塞标志【转】
转自:http://blog.csdn.net/yikai2009/article/details/8653697 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 阻塞 阻 ...
- 【转载】阻塞队列之三:SynchronousQueue同步队列 阻塞算法的3种实现
一.SynchronousQueue简介 Java 6的并发编程包中的SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除 ...
- 哪些地方会出现css阻塞,哪些地方会出现js阻塞?
Js的阻塞特性: 所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等.直到JS下载.解析.执行完毕后才开始继续并行下载其他资源并呈现内容.为了提高用户体验,新一代浏览器 ...
- 阻塞队列之三:SynchronousQueue同步队列 阻塞算法的3种实现
一.SynchronousQueue简介 Java 6的并发编程包中的SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除 ...
- swoole(3)网络服务模型(单进程阻塞、预派生子进程、单进程阻塞复用模型)
一:单进程阻塞 设计流程: 创建一个socket,绑定端口bind,监听端口listen 进入while循环,阻塞在accept操作上,等待客户端连接进入,进入睡眠状态,直到有新的客户发起connet ...
- Android学习之PopupWindow
Android的对话框有两种:PopupWindow和AlertDialog. 详细说明如下: AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情: AlertDi ...
- Android中Popupwindow和Dialog的区别
Android中的对话框有两种:PopupWindow和AlertDialog.它们都可以实现弹窗功能,但是他们之间有一些差别,下面总结了一点. (1)Popupwindow在显示之前一定要设置宽高, ...
- 探真无阻塞加载javascript脚本技术,我们会发现很多意想不到的秘密
下面的图片是我使用firefox和chrome浏览百度首页时候记录的http请求 下面是firefox: 下面是chrome: 在浏览百度首页前我都将浏览器的缓存全部清理掉,让这个场景最接近第一次访问 ...
随机推荐
- 你好,C++(31)我终于找到对象啦!6.1 从结构化设计到面向对象程序设计
第6章 当C++爱上面向对象 很多第一次进入C++世界的人都会问:C++中的那两个加号到底是什么意思啊? C++是由C语言发展而来的,它比C语言多出的两个加号,实际上是C语言的自增操作符,表示C++语 ...
- Spring依赖注入的三种方式
看过几篇关于Spring依赖注入的文章,自己简单总结了一下,大概有三种方式: 1.自动装配 通过配置applicationContext.xml中的标签的default-autowire属性,或者标签 ...
- underscorejs-max学习
2.15 max 2.15.1 语法: _.max(list, [iteratee], [context]) 2.15.2 说明: 返回list中的最小值. list为集合,数组.对象.字符串或arg ...
- 文成小盆友python-num7 -常用模块补充 ,python 牛逼的面相对象
本篇内容: 常用模块的补充 python面相对象 一.常用模块补充 1.configparser模块 configparser 用于处理特定格式的文件,起内部是调用open()来实现的,他的使用场景是 ...
- Python新手学习基础之函数-可变参数**
可变参数( ** ) 讲好了一颗*,那如果函数的最后一个参数带有 ** 前缀: 所有正常参数之外的其他的关键字参数都将被放置在一个字典中传递给函数. 要好好理解* 和 ** 两种可变参数哦~ 看个** ...
- ASP.NET 无权访问所请求的资源。请考虑对 ASP.NET 请求标识授予访问此资源的权限。
如题,在编译程序时,没有问题,但是通过iis设置的网站进入时,报如上错误.asp.net有个运行账户,一般情况下iis5为aspnet,iis6为network service,在iis里面确认一下是 ...
- 从Profile中窥探Unity的内存管理
刨根问底U3D---从Profile中窥探Unity的内存管理 这篇文章包含哪些内容 这篇文章从Unity的Profile组件入手,来探讨一下Unity在开发环境和正式环境中的内存使用发面的一些区别, ...
- 个人.net学习规划路线
- dnat,snat
Iptables实现NAT是最基本的功能,大部分家用路由都是基于其SNAT方式上网,使用Iptables实现外网DNAT也很简单,不过经常会出现不能正常NAT的现象. 以下命令将客户端访问1.,很多人 ...
- oracle索引总结
简介 1.说明 1)索引是数据库对象之一,用于加快数据的检索,类似于书籍的索引.在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的信 ...