我有一个 EditText
,我将错误设置在其中或在更改文本后删除错误。但是,当尝试从afterTextChanged()
方法访问EditText
时,我以某种方式得到了 npe 。
phone_number_input.addTextChangedListener(object : TextWatcher() {
...
override fun afterTextChanged(s: Editable?) {
if (isValid(s.toString())
phone_number_input.error = null // <-- NPE happens here
else
phone_number_input.error = "Number is invalid"
}
})
它不是不断重现的,但是在上个月,在不同设备上有数十个崩溃,从 android 4.4.2最高为6.0.1。
。那怎么会发生?如果Fragment
被销毁,则不应调用TextWatcher
,对吗?如何预防?
那怎么会发生?
很可能发生这种情况时,您的应用在用户键入时将进入前景(例如,由于传入的呼叫)。
如果
Fragment
被销毁,则不应打电话给TextWatcher
,对吗?
对。但是您缺少Fragment
和Layout
在"内部"中膨胀的顺序。这两个的破坏不是同时进行的-Layout
首先被销毁。
您可以看到,TextWatcher
是一个匿名的内类实例,它可以涉及其外部类,即您的Fragment
,该类别将在上次被销毁。这里的要点是,从 TextWatcher
中的EditText
中的任何文本更改都是异步完成的 - 您的应用程序的过程视图从系统中的另一个过程,软键盘应用程序(默认一个)中获取"通知"。
如果您的EditText
曾被销毁,但您的Fragment
没有,您会得到 npe 。。
如何预防?
只需使用phone_number_input?.error = ...