DialogFragment & FragmentManager.beginTransaction()' on a null object reference

问题

友盟报了一个不是很好复现的错,关于 DialogFragment

java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentTransaction android.support.v4.app.FragmentManager.beginTransaction()' on a null object reference
    at android.support.v4.app.DialogFragment.show(DialogFragment.java:141)
    at com.riselinkedu.system.TaskNetErrorDialog.show(TaskNetErrorDialog.kt:53)
    at com.riselinkedu.repository.NoneCommitManager.showNetErrorDialog(NoneCommitManager.kt:90)

解决

空指针异常,但是无法复现,后来添加延时来复现bug,才定位到问题。

请求数据失败,失败回调调用显示弹窗时,已不再当前页面了,所以需要添加一个判断

是否当前 Activity 或 Fragment 已被销毁
manager.isDestroyed

是否持有状态
manager.isStateSaved

添加如下判断,封装成类,就可以适用大部分异常场景了

    private fun show(manager: FragmentManager) {
        if (manager.isDestroyed || manager.isStateSaved) {
            Log.e(TAG, "FragmentManager isDestroyed or isStateSaved")
            return
        }

        if (isAdded) {
            Log.e(TAG, "DialogFragment isAdded")
            manager.beginTransaction().remove(this).commit()
        }

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