Kotlin Android扩展:java.lang.IllegalStateException:视图不能为null

时间:2019-01-22 13:37:02

标签: android kotlin android-view kotlin-android-extensions

我在片段中使用kotlin视图绑定。在某些情况下,应用IllegalStateException崩溃且视图为null时,我正在可运行文件中访问它,该运行文件使用延迟为1.5秒的处理程序进行调用。

 numberRunnable = Runnable {
        if (mobileView.text.toString().isNotEmpty() && Utility.isMobileNumberValid(mobileView.text.toString())) {
            presenter.getCustomerDetails(Utility.getServerAcceptableContactNumber(mobileView.text.toString()))
        }
    }

mobileView为空

处理程序代码:       handler.postDelayed(numberRunnable, 1500)

我知道有一种可能性可以检查片段中的isAdded,但是由于我无法复制该错误,因此不确定是否是问题所在。

2 个答案:

答案 0 :(得分:1)

您不能假设1.5秒后视图仍附加到视图层次结构。

在片段不再活动时,将handler.removeCallbacks(numberRunnable)添加到您的onStop()生命周期回调中,以删除numberRunnable

还问自己一个问题,为什么需要延误。

答案 1 :(得分:1)

该操作可能在用户离开Fragment并调用onDestroy()之后执行。在这种状态下,片段中将没有View实例。

一个简单的解决方法是创建一个全局var来检查Fragment的创建状态。在超级调用之前,将其设置为{{1}中的trueonViewCreated()中的false。然后在执行逻辑之前检查Runnable内部的值。

一个更好的解决方案(尽管这受竞争条件的影响,并且需要将每个Runnable分配给全局变量)可能是使用onDestroyView()方法并传递所有Runnable。

Handler.removeCallbacks()

另一种可能性是简单地说View是可为空的:

override fun onDestroyView() {
    handler.removeCallbacks(numberRunnable)
}