我们需要处理弱引用和上下文切换吗?

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() 调用的结果。