Maison > Questions et réponses > le corps du texte
大家讲道理2017-04-17 16:03:37
PopupWindow中不包含Window对象,它会自行管理控制树与窗口服务建立双向连接。
PopupWindow的出现不像AlertDialog是在固定的位置出现的 它是要依赖与锚点控制对象的位置,即界面中某个控件的位置,在构造并展示弹出窗口前需要保证锚点控件与窗口管理服务建立联系,窗口的连接的建立是异步过程。
也就是说当Activity.onCreate等函数调用时,界面与窗口服务的双向连接还没有建立,如果此时构造弹出窗口会抛出异常,会阻塞线程。
可以通过View.post()函数发送过来的消息放入一个静态队列中,当通信建立后在从队列中取出执行。
迷茫2017-04-17 16:03:37
个人认为描述网上资料不准确
实际上两种方式都不阻塞子线程的执行,子线程该干嘛还是干嘛
主线程理论上都“阻塞”住了,只不过一个是其他区域可以接收响应touch事件,一个不可以罢了
不可以接收响应touch事件的估计就被描述成阻塞线程的了
巴扎黑2017-04-17 16:03:37
其实我也不太理解……因为PopupWindow反而比AlertDialog要更加不影响主界面使用。比如Spinner在以前的android版本就是通过AlertDialog的形式完成,会在手机屏幕中央弹出对话框,而此时你只能操作对话框的内容,除非对话框消失了。而现在版本的Spinner就是PopupWindow实现的,你就会发现,PopupWindow显示外,可以点击界面其他位置,也能触发事件。
至于你的猜想,我认为应该是不对的,或者网上的说法有误区,或者描述有歧义。