在DialogFragment中存储Activity Context会导致内存泄漏吗?

时间:2016-04-26 19:49:07

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

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

@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的Context。

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

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

然后是这样的方法:

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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