Android AlertDialog.Builder活动泄漏

Android AlertDialog.Builder活动泄漏,android,android-activity,memory-leaks,Android,Android Activity,Memory Leaks,当我们创建AlertDialog.Builder时,我们传递将显示对话框的活动的上下文 AlertDialog.Builder builder = new Builder(getActivity()); <<< Activity Context passed as argument mAlertDialog = builder.create(); mAlertDialog.show(); AlertDialog.Builder=新的生成器(

当我们创建AlertDialog.Builder时,我们传递将显示对话框的活动的上下文

      AlertDialog.Builder builder = new Builder(getActivity()); <<< Activity Context passed as argument
      mAlertDialog = builder.create();
      mAlertDialog.show();

AlertDialog.Builder=新的生成器(getActivity()) 虽然这可能无法完全回答您的问题,但以下是一些观察结果:

只要构建器“处于活动状态”,垃圾收集器就可能不会触及
活动

现在,像您问题中的代码片段这样的代码通常是将在UI线程上执行的某些方法的一部分(因为涉及到一个UI元素--
AlertDialog

AlertDialog.Builder
实例是在该方法内部创建的,因此在该方法完成后将有资格进行垃圾收集,因为这样就不会有任何内容包含对该方法的引用

另一方面,活动将至少在调用并返回
onPause()
之前一直存在

这不是在泄露活动吗

只要该方法在UI线程上运行,就不需要。在其他情况下(例如
AsyncTask
),最好使用
WeakReference
。或者尽可能使用应用程序上下文(例如使用
SQLiteOpenHelper

顺便说一句,最近我有一个
AlertDialog
,它在方向改变时消失了,我没有放弃它(作为模拟器,棒棒糖)。Logcat显示了
WindowManager
的一条消息,其中提到我的
对话框
是“泄漏的窗口”,因此我现在认为,关闭
警报对话框
对于避免内存泄漏很重要


由于我想保留对话框(以及目前为止的用户输入),我切换到了
AlertDialog
-As-
DialogFragment
解决方案,如来自文档的解决方案。从那时起,警告消息一直没有出现。

使用(!getActivity().isFinishing())mAlertDialog.show();tryI think一旦调用builder.create(),它将返回一个alertdialog,并且builder对象将被标记为gc。如果我们尝试将ApplicationContext用于Dialog,它将崩溃。它只需要引用活动上下文。@Sumit Trehan-是的,你说得对。我提到应用程序上下文“在可能的情况下”,因为我想到了数据库助手。但是,如果您的对话框生成器是在UI线程上的“普通”方法中创建的,那么它似乎没有问题。因为它将在方法完成后立即被垃圾收集。因为没有指向此对象的引用。内存泄漏的问题在于,某个引用了我的活动的线程可能会永远运行下去,因为当活动停止时,我没有取消它。