提问人:Pol 提问时间:9/25/2018 最后编辑:Jeel VankhedePol 更新时间:9/25/2018 访问量:1954
WeakReference.get() 在检查后返回 null
WeakReference.get() returns null after being checked for it
问:
我有一个从视图执行的异步任务,并在其中使用检索视图的实例,并检查该实例是否与 不同。
稍后,我调用了一个方法,我得到了一个.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();
}
谢谢。
答:
我不认为在AsyncTask期间保存View的引用是好方法。您应该以不同的方式更改执行异步工作的体系结构。请查看 Android Jetpack,在那里您可以找到 Android 开发中几乎所有案例的最佳实践方法。如果您使用 Android 架构组件,则将自动处理与“活动已销毁”状态相关的任何问题。
关于您的情况,当垃圾回收器决定时,可以随时清除 WeakReference。因此,您可以随时看到“null”是正常情况。
“weakReference.get()值有什么不同于我一开始得到的引用吗?” - 是的,例如,当内存量不足时,用户将旋转屏幕或android系统可以销毁并重新创建您的活动。之后,将重新创建包含所有视图的活动,这意味着系统将创建所有视图的新实例。
“视图的 method() 调用是否可能导致 nullPointerException?” - 是的,它实际上经常发生。例如,您启动了 AsyncTask,然后在 AsyncTask 完成之前旋转屏幕。
评论
Q1:从我得到的参考资料中调用它来解决吗?
是的,它将通过从引用调用它来解决。因此,如果引用为 null,则处理它或将其用作调用。method()
Q2:weakReference.get()
值与我一开始得到的引用有什么不同吗?
是的,如果发生任何配置更改(活动/片段重新创建自身),则表示该视图已重新创建,您的旧视图引用将为 。null
结论:最好引用您的视图并进一步执行该引用中的任何操作
评论