(android) Android中PopupWindow是阻塞线程的具体是什么意思?

问题描述

我看到网上说AlertDialog是非阻塞线程的,而PopupWindow是阻塞线程的。
原文连接1
原文连接2
可是我不理解这里面的阻塞是怎么个阻塞法。

猜想

这里我有几个猜想,希望能够指教。

  1. 当PopupWindow弹出来后,整个app的所有线程都阻塞了,只有等PopupWindow被dismiss后所有的线程才会继续。

  2. 当PopupWindow弹出来后,主线程被阻塞了,其他的子线程都照常运行,只有等PopupWindow被dismiss后主线程才会继续。也就是说屏幕上的点击事件啦,各种动画啦,只要是在主线程中的内容什么都无效了。

PopupWindow中不包含Window对象,它会自行管理控制树与窗口服务建立双向连接。
PopupWindow的出现不像AlertDialog是在固定的位置出现的 它是要依赖与锚点控制对象的位置,即界面中某个控件的位置,在构造并展示弹出窗口前需要保证锚点控件与窗口管理服务建立联系,窗口的连接的建立是异步过程。
也就是说当Activity.onCreate等函数调用时,界面与窗口服务的双向连接还没有建立,如果此时构造弹出窗口会抛出异常,会阻塞线程。
可以通过View.post函数发送过来的消息放入一个静态队列中,当通信建立后在从队列中取出执行。

个人认为描述网上资料不准确
实际上两种方式都不阻塞子线程的执行,子线程该干嘛还是干嘛
主线程理论上都“阻塞”住了,只不过一个是其他区域可以接收响应touch事件,一个不可以罢了
不可以接收响应touch事件的估计就被描述成阻塞线程的了

其实我也不太理解……因为PopupWindow反而比AlertDialog要更加不影响主界面使用。比如Spinner在以前的android版本就是通过AlertDialog的形式完成,会在手机屏幕中央弹出对话框,而此时你只能操作对话框的内容,除非对话框消失了。而现在版本的Spinner就是PopupWindow实现的,你就会发现,PopupWindow显示外,可以点击界面其他位置,也能触发事件。

至于你的猜想,我认为应该是不对的,或者网上的说法有误区,或者描述有歧义。

这种事情就是自己做实验啊,不过我感觉你被误导了

Popupwindow可以通过设置响应区域外事件,我看不不太明白这两个链接。

不对的。不存在阻塞线程这种说法

发表评论

电子邮件地址不会被公开。 必填项已用*标注