WeakReference.get()经过检查后返回null

时间:2018-09-25 12:31:37

标签: android android-asynctask nullpointerexception weak-references

我有一个从视图执行的异步任务,并在其onPostExecute中使用weakReference.get()检索该视图的实例,并检查该实例是否与null不同。 稍后在onPostExecute中,我从weakReference.get()调用一个方法,然后得到一个NullPointerException

  1. 是否可以通过从我得到的引用中调用它来解决?

  2. weakReference.get()值是否与我刚开始获得的引用有什么不同?

例如,视图的method()调用是否有可能导致NullPointerException

  

示例:

private WeakReference<View> weakReference;

[...]

@Override
protected void onPostExecute(Boolean result) {    
    View v = weakReference.get();
    if (v == null) {
        return;
    }
    […]
    getView().method();
}

非常感谢您。

2 个答案:

答案 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


  

结论: 最好是引用您的视图并从该引用中进一步执行任何操作