我们需要处理弱引用和上下文切换吗?
Do we need to handle weak reference and context switching?
为了减轻内存泄漏,我们在不同线程的内部 class 运行 中保留 activity 的弱引用。我们检查 weakreference.get() 是否为非空,然后才继续进行。如果当我们检查 weakreference.get() 是非 null 但垃圾收集发生时,我们是否需要一次又一次地检查引用是否非 null 还是我遗漏了什么?
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?
}
}
}
}
您应该在每次访问您的变量时检查非空状态。
但是......还有一个额外的问题,你必须在使用它之前考虑 activity 状态(我的意思是生命周期状态)。
你应该做的是:
MainActivity temp = mainActivity.get();
if (temp != null){
// Use 'temp' to access the `MainActivity`
}
假设 temp
不是 null
,您 现在 有一个实时的 MainActivity
对象的常规引用变量意味着该对象是强可达的。垃圾收集器不会收集它。
(事实上,只要 temp
仍然可以访问,GC 就不会破坏你的 WeakReference
。规范说明 GC 不会破坏(可访问的)Reference
如果 ref 的目标是强可达的。)
但不利的一面是,如果您没有对 MainActivity
的强引用,那么 GC 可能 破坏 WeakReference
随时。因此,您应该 始终检查 get()
调用的结果。
为了减轻内存泄漏,我们在不同线程的内部 class 运行 中保留 activity 的弱引用。我们检查 weakreference.get() 是否为非空,然后才继续进行。如果当我们检查 weakreference.get() 是非 null 但垃圾收集发生时,我们是否需要一次又一次地检查引用是否非 null 还是我遗漏了什么?
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?
}
}
}
}
您应该在每次访问您的变量时检查非空状态。 但是......还有一个额外的问题,你必须在使用它之前考虑 activity 状态(我的意思是生命周期状态)。
你应该做的是:
MainActivity temp = mainActivity.get();
if (temp != null){
// Use 'temp' to access the `MainActivity`
}
假设 temp
不是 null
,您 现在 有一个实时的 MainActivity
对象的常规引用变量意味着该对象是强可达的。垃圾收集器不会收集它。
(事实上,只要 temp
仍然可以访问,GC 就不会破坏你的 WeakReference
。规范说明 GC 不会破坏(可访问的)Reference
如果 ref 的目标是强可达的。)
但不利的一面是,如果您没有对 MainActivity
的强引用,那么 GC 可能 破坏 WeakReference
随时。因此,您应该 始终检查 get()
调用的结果。