今天跟大家唠唠嗑,关于我在安卓开发中遇到的一个常见问题:`*()` 失效! 真的是让人头大,折腾好久才搞明白。
事情是这样的,当时我在做一个APP,里面有个功能需要弹出一个对话框,让用户选择一些选项。一切都很顺利,对话框弹出来,选项也都能选。但是!当我点击“确定”或者“取消”按钮,想要关闭对话框的时候,它竟然纹丝不动!我内心OS:这dialog 怕不是跟我对着干?
第一反应肯定是看代码!我仔仔细细地检查关闭对话框的代码,确认调用 `*()` 方法。没毛病,为啥就是不消失?
- 开始排查:
- 线程问题? 难道是在子线程中调用的? 安卓UI更新必须在主线程进行,这个是常识。 我赶紧用 `runOnUiThread()` 包裹一下 `*()`, 结果,呵呵,还是不行。
- Context 泄漏? 是不是Context有问题,导致dialog无法正常关闭? 换个Context,依然无效。
这时候我开始怀疑人生,难道是我的代码姿势不对? 于是开始疯狂Google、百度。 搜一堆资料,各种方法都试,什么 `*()`、设置 `*(true)`,甚至尝试自定义Dialog,统统没用!
柳暗花明:
就在我快要放弃的时候,突然看到一篇帖子,里面提到一种情况:如果对话框的 `Context` 已经失效,比如 `Activity` 已经 `finish()` ,那么调用 `*()` 是不会有任何效果的!
我瞬间醒悟! 仔细一想,我的对话框是在一个异步任务中弹出的,而这个异步任务可能会在 `Activity` 已经销毁之后才执行完成。也就是说,当异步任务执行到 `*()` 的时候,`Activity` 可能已经不在,`Context` 也跟着失效。
解决方案:
找到问题所在,解决起来就简单。 我在异步任务中,先判断一下 `Activity` 是否还存活,如果 `Activity` 已经销毁,就直接放弃关闭对话框的操作。
java
if (!isFinishing()){ // 加上这句判断
或者使用 `*()` (API level 17+)
最终:
加这句判断之后,问题完美解决! 对话框终于可以正常关闭! 这回经历让我明白,看似简单的一个 `*()`,背后也可能隐藏着很多坑。 在开发过程中,一定要注意各种细节,避免掉进坑里。
这回`*()` 失效的原因是:对话框的 Context 失效导致无法正常关闭。 解决方法是:在调用 `*()` 之前,先判断 Context 是否有效。
希望这回分享能帮助到遇到同样问题的同学们,少走一些弯路。 码农不易,且行且珍惜!