【问题标题】:is it a memory leak in fragment onAttach using mActivity = context?使用 mActivity = context 在片段 onAttach 中是否存在内存泄漏?
【发布时间】:2020-11-30 14:07:57
【问题描述】:

我使用 mActivity 来维护活动的上下文。

onAttach

    override fun onAttach(context: Context) {
        super.onAttach(context)
        if(context is Activity) mActivity  = context
    }

我想如果我使用这个,那将是内存泄漏,因为 mActivity 维护活动引用,并且当活动被销毁时,mActivity 仍然引用被销毁的活动。 mActivity 是不是很好用?

【问题讨论】:

  • 为避免内存泄漏,您可以在分离时将 mActivity 设置为 null
  • 我知道那种方式,但是如果我想在activity被销毁后使用上下文,我不能使用那种方式。 like thisHandler(Looper.getMainLooper()).postDelayed({ showToast(mActivity!!,"activity!!") },5000) // after activity is destroyed,这样会报错。
  • 就我个人而言,当有更好的获取方式时,我认为没有必要保留对上下文的引用
  • 如果是Fragment,那么你应该使用已经存在的getActivity()。是的,它会在分离后返回null,你不应该使用分离的Activity

标签: android


【解决方案1】:

如果您想将活动用作消息的上下文。您应该在分离时添加mHandler.removeCallbackmHandler.removeMessages


看来这个操作是可行的。 但是你需要知道的是,内存泄漏是因为一个生命周期较长的对象(singleton..)持有对一个生命周期较短的对象(Activity或Fragment)的引用。

if(getActivity() != null){...}
// when you use getActivity()=, you need a NPE check.

如果您使用mActivity = getAcitvity。你可以一直使用mActivity 作为上下文。 MaenWihle 片段分离后的片段保持活动。您可以在 onDetached 方法中将 mActivity 设置为 null。那么你应该需要另一个 NPE 检查。

if(mActivity != null){...}
// when you use mActivity, you also need a NPE check.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2011-10-07
    • 2015-07-20
    • 2013-11-30
    • 2011-01-29
    • 2011-05-08
    • 2012-03-10
    相关资源
    最近更新 更多