问题
友盟报了一个不是很好复现的错,关于 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)
}