关于坑爹的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: 在浏览百度首页前我都将浏览器的缓存全部清理掉,让这个场景最接近第一次访问 ...
随机推荐
- 重温web服务器--细说Tomcat服务器
从大学开始接触java web的开发时就开始使用tomcat部署web项目,对它的理解仅仅停留在"这是个开源免费的servlet容器"的阶段,后来也接触了一些tomcat的体系,原 ...
- Java基础--IO
1,流的认识和分类 2,Java种处理流的IO类架构 3,字节流和字符流转换 4,NIO的概述 5,Java IO关闭资源 1,流的认识和分类 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的 ...
- SxsTrace工具使用方法(转)
http://blog.sina.com.cn/s/blog_494e45fe0102dtt3.html Windows7平台上有一个强大的SxsTrace工具,可以跟踪调试应用程序运行时需要的动态库 ...
- 【行为型】Memento模式
备忘录模式顾名思义就是一种能有备忘作用的设计模式,其目的是在对象外部保存其在某一时刻的状态信息,并且在任何需要的时候,都可以通过备忘录中保存的状态数据恢复对象在当时情形下的状态. 备忘录模式旨在对象的 ...
- [Python笔记]第十篇:模块续
requests Python标准库中提供了:urllib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简 ...
- 写给新手看的Flask+uwsgi+Nginx+Ubuntu部署教程
学习 Flask,写完一个 Flask 应用需要部署的时候,就想着折腾自己的服务器.根据搜索的教程照做,对于原理一知半解,磕磕碰碰,只要运行起来了,谢天谢地然后不再折腾了,到下一次还需要部署时,这样的 ...
- Equivalent Strings (字符串相等?)
Equivalent Strings E - 暴力求解.DFS Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I ...
- Python下划线的使用 _ __ __obj__
Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from moduleimport *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避 ...
- Linux_hadoop_install
1. Build Linux env my env is VM RedHat Linux 6.5 64bit set fixed IP vim /etc/sys ...
- Mahout
http://blog.csdn.net/yueyedeai/article/details/26567379