微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决我们是否需要处理弱引用和上下文切换?

为了减少内存泄漏,我们在不同线程上运行的内部类中保留对活动的弱引用。我们检查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 举报,一经查实,本站将立刻删除。