WeakReference.get() 在检查后返回 null

WeakReference.get() returns null after being checked for it

提问人:Pol 提问时间:9/25/2018 最后编辑:Jeel VankhedePol 更新时间:9/25/2018 访问量:1954

问:

我有一个从视图执行的异步任务,并在其中使用检索视图的实例,并检查该实例是否与 不同。 稍后,我调用了一个方法,我得到了一个.onPostExecuteweakReference.get()nullonPostExecuteweakReference.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();
}

谢谢。

android-asynctask nullpointerexception 弱引用

评论


答:

2赞 Vito 9/25/2018 #1

我不认为在AsyncTask期间保存View的引用是好方法。您应该以不同的方式更改执行异步工作的体系结构。请查看 Android Jetpack,在那里您可以找到 Android 开发中几乎所有案例的最佳实践方法。如果您使用 Android 架构组件,则将自动处理与“活动已销毁”状态相关的任何问题。

关于您的情况,当垃圾回收器决定时,可以随时清除 WeakReference。因此,您可以随时看到“null”是正常情况。

“weakReference.get()值有什么不同于我一开始得到的引用吗?” - 是的,例如,当内存量不足时,用户将旋转屏幕或android系统可以销毁并重新创建您的活动。之后,将重新创建包含所有视图的活动,这意味着系统将创建所有视图的新实例。

“视图的 method() 调用是否可能导致 nullPointerException?” - 是的,它实际上经常发生。例如,您启动了 AsyncTask,然后在 AsyncTask 完成之前旋转屏幕。

评论

2赞 Pol 9/25/2018
非常感谢维托。我必须说,这个遗留代码不是我的。我们希望将 Jetpack 引入到我们的代码中。
1赞 Jeel Vankhede 9/25/2018 #2

Q1:从我得到的参考资料中调用它来解决吗?

是的,它将通过从引用调用它来解决。因此,如果引用为 null,则处理它或将其用作调用。method()


Q2:weakReference.get() 值与我一开始得到的引用有什么不同吗?

是的,如果发生任何配置更改(活动/片段重新创建自身),则表示该视图已重新创建,您的旧视图引用将为 。null


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