关于坑爹的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#串口控制
串行口是计算机的标准接口,现在的PC机(个人电脑)一般至少有两个串行口COM1和COM2.串行口应用广泛,在数据通信.计算机网络以及分布式工业控制系统中,经常采用串行通信来交换数据和信息.本节通过几个 ...
- PHP 读取/导出 CSV文件
工作中经常会有遇到导入/导出的需求,下面是常用的方法.读取CSV文件,可以分页读取,设置读取行数,起始行数即可.导出CSV文件,用两种方法进行实现. /** * 读取CSV文件 * @param st ...
- python使用platform模块获取系统环境并去除换行符
近来在porting一个网站,企图拿到这个网站的数据来做分析.为了支持多系统环境的正常运行.需要知道当前系统环境的是什么OS? 1.python内置platform库.可以很方便得到当前系统环境时什么 ...
- Seajs教程
API 快速参考 该页面列举了 Sea.js 的常用 API.只要掌握这些用法,就可以娴熟地进行模块化开发. seajs.config 用来对 Sea.js 进行配置. seajs.config({ ...
- Scut:通用配置管理器
1. 配置节 ConfigSection private List<ConfigNode> _configNodes; public class ConfigNode { public C ...
- Github上最受关注的前端大牛,快来膜拜吧!
1. Paul Irish Github主页: https://github.com/paulirish 个人主页: http://paulirish.com 维基百科: http://en.wiki ...
- Android ContentProvider 简介
当在系统中部署一个又一个Android应用之后,系统里将会包含多个Android应用,有时候就需要在小同的应用之问芡亭数据,比如现在有一个短信接收应用,用户想把接收到的陌生短信的发信人添加到联系人管理 ...
- PCB模擬設計接地的指導原則
接地無疑是系統設計中最為棘手的問題之一.盡管它的概念相對比較簡單,實施起來卻很復雜,遺憾的是,它沒有一個簡明扼要可以用詳細步驟描述的方法來保證取得良好效果,但如果在某些細節上處理不當,可能會導致令人頭 ...
- Spring Data Elasticsearch
项目清单 elasticsearch服务下载包括其中插件和分词 http://download.csdn.net/detail/u014201191/8809619 项目源码 资源文件 ...
- Ubuntu配置ecilpse终端启动
1. 使用Root用户登陆:但如果要使用root用户登录,必须先为root用户设置密码: (1)打开终端,输入:sudo passwd root 然后enter 此时会提示你输入密码,在passwor ...