如何解决我们是否需要处理弱引用和上下文切换?
为了减少内存泄漏,我们在不同线程上运行的内部类中保留对活动的弱引用。我们检查weakreference.get() 是否为非空,然后才继续进行。如果当我们检查weakreference.get() 是非空的但发生了垃圾收集时,我们是否需要一次又一次地检查引用是否为非空或者我遗漏了什么?
public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new MyAsyncTask(this).execute();
}
private static class MyAsyncTask extends AsyncTask {
private WeakReference<MainActivity> mainActivity;
public MyAsyncTask(MainActivity mainActivity) {
this.mainActivity = new WeakReference<>(mainActivity);
}
@Override
protected Object doInBackground(Object[] params) {
return doSomeStuff();
}
@Override
protected void onPostExecute(Object object) {
super.onPostExecute(object);
if (mainActivity.get() != null){
//do something
//context switching and garbage collection happen
//again do a null check?
}
}
}
}
解决方法
你应该做的是:
MainActivity temp = mainActivity.get();
if (temp != null){
// Use 'temp' to access the `MainActivity`
}
假设 temp
不是 null
,您现在在活动变量中有对 MainActivity
对象的常规引用的事实意味着该对象是强可达的。垃圾收集器不会收集它。
(实际上,只要 WeakReference
仍然可达,GC 就不会破坏您的 temp
。规范指出,GC 不会破坏(可达){{1} } 如果 ref 的目标是强可达的。)
但另一方面,如果您没有对 Reference
的强引用,那么 GC 可能随时破坏 MainActivity
。因此,您应该总是检查 WeakReference
调用的结果。
您应该检查对变量的每次访问的非空状态。 但是...还有一个额外的问题,你必须在对它做一些事情之前考虑它的状态(我的意思是生命周期状态)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。