Android 在DialogFragment中存储活动上下文会导致内存泄漏吗?

Android 在DialogFragment中存储活动上下文会导致内存泄漏吗?,android,android-activity,memory-leaks,android-context,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(

我在整个项目中都在做以下工作,这会导致内存泄漏吗

@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();
if(mCallback != null){
   mCallback.showAlertDialog();
}
做上述事情行吗?如果我试图在AsyncTask的onPostExecute()中显示AlertDialog呢

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

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

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    mCallback = (MyCallback)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();
if(mCallback != null){
   mCallback.showAlertDialog();
}

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

在显示
警报对话框之前,您可以检查
片段是否已添加到
活动中

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


Fragment
具有
getActivity()
,您可以在需要承载它的活动时调用它。我以前也这样做过,但调用getActivity()检查是否为null,如果不是null,则再次调用getActivity()以获取上下文。我这样做得到了一个NPE,我想是因为在我第一次调用getActivity()之后,活动就被gc’ed了。在第一次调用getActivity()之后存储活动,然后使用它是否会导致任何潜在的内存泄漏?这样做不应该获得任何好处。如果是,那是因为您引入了内存泄漏。您的片段不应该在后台线程中或在
onDetach()之后对活动执行任何操作。在
onAttach()
onDetach()
之间,
getActivity()
应该返回一个非空值。IMHO,你充其量只是修补了真正的问题:当你的片段不应该与活动一起工作时,尝试使用活动。嗯,这是有道理的。我可能应该将此更改为使用一个接口来告诉活动本身显示此AlertDialog,而不是片段执行此操作。谢谢你的帮助!谢谢你给我写的每一篇文章:)事实上,我认为这样做也会导致内存泄漏。我将用一个例子更新我的问题。