前提:DialogManager统一管理所有的弹窗弹出和消失,它是一个单例
现象:
MainActivity中点击一个按钮,弹出一个弹窗(因为一些奇怪的理由,导致实现的时候这个弹窗并不是用PopupWindow或者Dialog来实现,而是通过activity.window.decorView.addView的来展示的(ps:这导致后面分析的时候出现来一点点方向上的错误)),然后退出app(这时候并没有杀死app,直接finish掉的MainActivity),进来之后再次点击按钮,弹窗木有出现
排查问题:
点一次,然后退出,再进入,手贱点了两次,发现是由于DialogManager 队列阻塞导致的不显示,沿着这个方向找了会,发现好像没有问题
点一次,然后退出,再进入,再次点击,仍然没有显示,这时候队列并没有阻塞,addView执行了,难道addView出问题了吗?以前倒是遇到过addView不展示的问题,比如说LinearLayout设置的方向不对,子View超出了屏幕,或者addView的时候没有设置LayoutParams,又或者焦点问题。挨个排查发现,好像并不是,Debug发现addView成功了,但是没有显示出来。那就应该转换思路,第一次展示和第二次不展示区别在哪呢?
在于第二次的MainActivity和第一次的MainAcitivty不同!Debug发现
第一张图是展示的时候各个参数,第二张图是不展示的时候的各个参数。
奇了怪哉!两次的DecorView一样!MainActivity都被finish掉了,DecorView怎么能一样呢?
好吧,DialogManager(这是单例)中存了每次弹窗需要的Context,而由于退出app(这时候并没有杀死app,直接finish掉的MainActivity),所以DialogManager变量一直在,导致addView一直add到了原先已经被finish掉的MainActivity布局上。
小结:其实如果在调试的时候可以提前缕下思路,找重点(这儿的重点就是区别点),而不是钻牛角尖认死理的执着于某一个问题。