问题描述:我在Activity中show了一个dialog关不掉了。
场景描述:我在A活动里,onCreate初始化了一个DIalog和一个CountDownTimer类型的计数器,并在计时器的构造中,传入当前的handler对象。计时器被我写成单例的。
然后当我点击A按钮的时候,启动Dialog和计时器,计时器倒计时5秒,发出消息,在handleMessage中,收到发送的消息,然后关闭Dialog。
第一次进入活动,点击A按钮,过5秒,收到消息然后关闭dialog,这个操作是正常的。但是当我退出当前活动
第二次进入活动,点击A按钮,过5秒,收到消息后,就关闭不掉这个dialog了。整个活动都是重新初始化的。
分析:经过一番测试之后,我发现dialog中的mShowing这个属性,在我第二次进入活动,并且dialog.show()调用之后,被修改为true。过五秒后,在handleMessage中,调用dialog.hide(),这时dialog的mShowing这个属性确是false,然后就关不掉dialog了。
如何解决:最后我是如何解决的呢,我把CountDownTimer这个计时器创建的单例给取消了,每次都重新创建一个新的对象并接收当前活动的handler对象。
后续:
dialog对象情况1:CountDownTimer是单例模式,并持有当前活动的handler对象
messageDialog1 hashcode:29560034是我第一次进入活动创建的dialog对象,然后我退出当前活动。
第二次进入活动,创建了一个新的dialog对象messageDialog1 hashcode:96367861
但是,当五秒过后,在handleMessage中,收到消息关闭dialog时,这个dialog对象反而是第一次创建的dialog对象
看hashcode
所以关闭不了dialog,因为根本就不是同一个对象。原因会继续找。
TIPS:这里做一个小结,建议不要在单例类中,持有hanlder对象,否则就会发生这种操蛋的问题。
网友评论