安卓安全显示dialog-拒绝crash

背景

安卓显示的dialog是依附于activity的,如果在dialog显示前,activity已经消失了,那dialog显示时就会导致crash.
报错日志如下:

AndroidRuntime: FATAL EXCEPTION: main
    Process: com.cxyzy.safedialog, PID: 32155
    android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@b194e0a for displayid = 0 is not valid; is your activity running?
        at android.view.ViewRootImpl.setView(ViewRootImpl.java:936)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:398)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:131)
        at android.app.Dialog.show(Dialog.java:531)

初步解决方案

遇到这样的问题,大家自然也知道怎么办,那就是在显示dialog前对activity进行判断

if (!(activity.isFinishing || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed)) {
    dialog.show()
}

于是代码里到处都充斥着这样的代码.
宝宝表示,很难过.

优化解决方案

归一化处理,让所有dialog集成基础dialog类,在基础dialog类里显示之前做一次判断.

/**
 * 安全显示dialog
 * 对所属activity应销毁的情况进行保护,避免显示时crash
 */
open class SafeBaseDialog(activity: Activity) : Dialog(activity) {
    private var mActivity: Activity = activity

    override fun show() {
        if (!isFinishingOrDestroyed(mActivity)) {
            super.show()
        }
    }

    private fun isFinishingOrDestroyed(activity: Activity): Boolean {
        return activity.isFinishing
                || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed)
    }
}

思考题

为什么google官方不直接在Dialog的show方法里做这个判断呢?
是我打开dialog的姿势不太好?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,510评论 0 17
  • 为了面试,为了高工资,废话不多说,不定期更新。 1. Activity正常和异常情况下的生命周期分析。 Activ...
    24K男阅读 850评论 0 0
  • 面试题总结 通用 安卓学习途径, 寻找资料学习的博客网站 AndroidStudio使用, 插件使用 安卓和苹果的...
    JingBeibei阅读 1,715评论 2 21
  • 转自 1. 什么是Activity? 四大组件之一,一般的,一个用户交互界面对应一个activity setCon...
    joe1632阅读 1,418评论 0 7
  • 朦胧地记着,第一次陪你聊天时间,地点,当然还有人物。当微信刚刚普及,当手机开始流行智能机的时候,我那个低音炮的山寨...
    许三千笔墨绘绝世倾城阅读 374评论 1 1