我在片段中使用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
,但是由于我无法复制该错误,因此不确定是否是问题所在。
答案 0 :(得分:1)
您不能假设1.5秒后视图仍附加到视图层次结构。
在片段不再活动时,将handler.removeCallbacks(numberRunnable)
添加到您的onStop()
生命周期回调中,以删除numberRunnable
。
还问自己一个问题,为什么需要延误。
答案 1 :(得分:1)
该操作可能在用户离开Fragment并调用onDestroy()
之后执行。在这种状态下,片段中将没有View实例。
一个简单的解决方法是创建一个全局var来检查Fragment的创建状态。在超级调用之前,将其设置为{{1}中的true
和onViewCreated()
中的false
。然后在执行逻辑之前检查Runnable内部的值。
一个更好的解决方案(尽管这受竞争条件的影响,并且需要将每个Runnable分配给全局变量)可能是使用onDestroyView()
方法并传递所有Runnable。
Handler.removeCallbacks()
另一种可能性是简单地说View是可为空的:
override fun onDestroyView() {
handler.removeCallbacks(numberRunnable)
}