【发布时间】: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 中会修复任何内存泄漏吗?
【问题讨论】:
-
Fragment有getActivity(),您可以在需要托管它的活动时调用它。 -
我之前这样做过,但调用 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