如果使用lateinit初始化变量,是否可以使用NPE?
1 / lateinit var pbar:ProgressBar
2 / pbar = findViewById(R.id.pbar_login)
3 /进行api调用,pbar.visibility = View.VISIBLE
4 /回滚并销毁活动(假设所有视图也将被销毁)
5 /
override fun onPostExecute() {
if (pbar != null) { // warning: pbar != null is always true
pbar.visibility = View.GONE // NPE??
}
}
问题:
1)如果我不进行检查,是否有可能获得NPE-if(pbar!= null)?
2)同样的问题,如果变量是通过综合扩展生成的,是否会有NPE?
我遇到了this问题,在这种情况下,我的进一步问题是
是否存在避免对活动,片段或recyclerview中与视图相关的变量进行NPE的最佳实践?
答案 0 :(得分:1)
如果我不检查-是否(pbar!= null),是否可以获得NPE?
不。该属性不能为null
。
但是,您仍然可能会崩溃。请勿尝试修改已销毁的活动,包括更新其视图。要么:
使用LiveData
之类的内容来告诉活动有关事件的信息,因此,如果活动在周围,活动可以对事件做出响应,但是如果活动被破坏,则可以忽略该事件;或
在尝试更新其视图之前,先检查活动上的isDestroyed
是否被销毁(还应考虑isFinishing
,因为您可能不必费心处理视图更新)
在这两种方法中,我强烈建议采用前一种方法,以取代AsyncTask
。
同样的问题,如果变量是通过综合扩展生成的,是否会有NPE?
否,它不能为null
,但是您仍然可以崩溃(请参见上文)。