我有一个从视图执行的异步任务,并在其onPostExecute
中使用weakReference.get()
检索该视图的实例,并检查该实例是否与null
不同。
稍后在onPostExecute
中,我从weakReference.get()
调用一个方法,然后得到一个NullPointerException
。
是否可以通过从我得到的引用中调用它来解决?
weakReference.get()
值是否与我刚开始获得的引用有什么不同?
例如,视图的method()
调用是否有可能导致NullPointerException
?
示例:
private WeakReference<View> weakReference;
[...]
@Override
protected void onPostExecute(Boolean result) {
View v = weakReference.get();
if (v == null) {
return;
}
[…]
getView().method();
}
非常感谢您。
答案 0 :(得分:1)
我认为在AsyncTask期间保存View的引用不是一种好方法。您应该以不同的方式更改进行异步工作的体系结构。请查看Android Jetpack,在那里您可以找到针对Android开发中几乎每种情况的最佳做法方法。如果您使用Android Architecture Components,则与“活动销毁”状态有关的任何问题都将自动处理。
关于您的情况,在垃圾收集器做出决定后,可以随时清除WeakReference。因此,通常情况下,您随时都可以看到“空”。
“是否有任何方法可以使weakReference.get()值与开始时获得的引用有所不同?” -是的,例如,当内存不足时,用户将旋转屏幕或android系统可以销毁并重新创建您的活动。之后,将重新创建带有所有视图的活动,这意味着系统将创建所有视图的新实例。
“视图的method()调用是否可能导致nullPointerException?” -是的,它实际上可能经常发生。例如,您启动了AsyncTask,然后在AsyncTask完成之前-旋转屏幕。
答案 1 :(得分:1)
问题1: 是否可以通过从我得到的引用中调用它来解决?
是的,可以通过引用引用来解决。因此,如果reference为null,请对其进行处理,否则将其用作method()
调用。
第二季度: weakReference.get()
值与我刚开始获得的参考有何不同之处吗?
是的,如果发生任何配置更改,(活动/片段会重新创建),这意味着将重新创建视图,而您的旧视图引用将为null
。
结论: 最好是引用您的视图并从该引用中进一步执行任何操作