【问题标题】:Will storing Activity Context in a DialogFragment cause a memory leak?将 Activity 上下文存储在 DialogFragment 中会导致内存泄漏吗?
【发布时间】:2016-08-20 20:12:45
【问题描述】:

我在整个项目中都在执行以下操作,这会导致内存泄漏吗?

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    mContext = activity;
}

然后用这样的方法:

new AlertDialog.Builder(mContext)
                .setTitle(getActivity().getString(
                        R.string.common_error))
                .setMessage(getActivity().getString(
                        R.string.common_please_try_again))
                .setPositiveButton(android.R.string.yes, null)
                .show();

以上操作可以吗?如果我试图在 AsyncTask 的 onPostExecute() 中显示 AlertDialog 怎么办?

编辑:正如所指出的,这会产生内存泄漏,因为我试图在其生命周期之外访问 Activity 的上下文。

但是下面会导致同样的问题吗?从 DialogFragment 显示 AlertDialog 的一般解决方案是什么?

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    mCallback = (MyCallback)activity;
}

然后用这样的方法:

if(mCallback != null){
   mCallback.showAlertDialog();
}

这会产生内存泄漏吗,将其包装在 WeakReference 中会修复任何内存泄漏吗?

【问题讨论】:

  • FragmentgetActivity(),您可以在需要托管它的活动时调用它。
  • 我之前这样做过,但调用 getActivity() 检查是否为 null,如果不是 null,则再次调用 getActivity() 以获取上下文。我认为这样做我得到了一个 NPE,因为在我第一次调用 getActivity() 之后,Activity 得到了 gc'ed right。在第一次调用 getActivity() 之后存储活动然后使用它会导致任何潜在的内存泄漏吗?
  • 你不应该通过这样做获得任何东西。而且,如果您 ,那是因为您引入了内存泄漏。您的片段不应该对后台线程中的活动或onDetach() 之后的活动做任何事情。在onAttach()onDetach() 之间,getActivity() 应该返回一个非null 值。恕我直言,你充其量只是修补了真正的问题:当你的片段不应该使用一个活动时尝试使用一个活动。
  • 嗯,有道理。我可能应该将其更改为使用界面来告诉 Activity 本身显示此 AlertDialog 而不是 Fragment 执行此操作。谢谢您的帮助!并感谢我从你那里读到的所有其他帖子:)
  • 其实我觉得这样做也会导致内存泄漏。我会用一个例子来更新我的问题。

标签: android android-activity memory-leaks android-context


【解决方案1】:

在显示AlertDialog 之前,您可以检查Fragment 是否已添加到Activity

if (getActivity != null) { 
  // Show dialog
}

if (isAdded()) { 
  // Show dialog
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 2014-10-18
    • 2021-03-23
    • 2021-09-25
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多