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

问题描述

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

猜想

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

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

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

阅读 4.6k
评论
    6 个回答

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

      相似问题
      推荐文章