Kotlin Android 扩展:java.lang.IllegalStateException:视图不能为空
Kotlin Android Extensions : java.lang.IllegalStateException: view must not be null
我在片段中使用了 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
,但由于我无法复制错误,所以我不确定它是否是问题所在。
您不能假设在 1.5 秒后视图仍然附加到视图层次结构。
将 handler.removeCallbacks(numberRunnable)
添加到您的 onStop()
生命周期回调中,以在片段不再处于活动状态时删除 numberRunnable
。
同时问问自己为什么需要延迟。
在用户离开 Fragment 并调用 onDestroy()
之后,该操作可能 运行。在那种状态下,Fragment 中将没有 View 实例。
一个简单的解决方法是创建一个全局变量来检查片段的创建状态。在 onViewCreated()
中将其设置为 true
,在 onDestroyView()
中将其设置为 false
(在 super 调用之前)。然后在执行逻辑之前检查 Runnable 中的值。
更好的解决方案(尽管这受限于竞争条件并且需要将每个 Runnable 分配给全局变量)可能是使用 Handler.removeCallbacks()
方法并传递所有 Runnable。
override fun onDestroyView() {
handler.removeCallbacks(numberRunnable)
}
另一种可能性是简单地说视图可以为空:
mobileView?.let {
//Your stuff goes in here
//You can reference mobileView using "it"
}
我在片段中使用了 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
,但由于我无法复制错误,所以我不确定它是否是问题所在。
您不能假设在 1.5 秒后视图仍然附加到视图层次结构。
将 handler.removeCallbacks(numberRunnable)
添加到您的 onStop()
生命周期回调中,以在片段不再处于活动状态时删除 numberRunnable
。
同时问问自己为什么需要延迟。
在用户离开 Fragment 并调用 onDestroy()
之后,该操作可能 运行。在那种状态下,Fragment 中将没有 View 实例。
一个简单的解决方法是创建一个全局变量来检查片段的创建状态。在 onViewCreated()
中将其设置为 true
,在 onDestroyView()
中将其设置为 false
(在 super 调用之前)。然后在执行逻辑之前检查 Runnable 中的值。
更好的解决方案(尽管这受限于竞争条件并且需要将每个 Runnable 分配给全局变量)可能是使用 Handler.removeCallbacks()
方法并传递所有 Runnable。
override fun onDestroyView() {
handler.removeCallbacks(numberRunnable)
}
另一种可能性是简单地说视图可以为空:
mobileView?.let {
//Your stuff goes in here
//You can reference mobileView using "it"
}