AlertDialog在活动完成时导致泄漏

时间:2015-01-06 20:57:53

标签: android memory-leaks

我有一个扩展FragmentActivity的基本活动。在这个活动中,我有一个带OK按钮的对话框。该对话框显示没有互联网连接。用户单击按钮后,活动结束。 我知道在退出活动之前,我必须在dismiss对象上调用AlertDialog。我尝试用两种方法做到这一点:onClick对象的DialogInterface.OnClickListener方法

builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            dialog.dismiss();
            BaseActivity.this.finish();
        }
    });

在我意识到之前的代码不起作用后,我尝试在我的BaseActivity类中创建一个成员变量并调用dismiss方法onDestroy

@Override
protected void onDestroy() {
    super.onDestroy();

    if (alertDialog != null) {
        alertDialog.dismiss();
        alertDialog = null;
    }
}

它也没用。我仍然在我的调试器中得到这个:

01-07 01:43:10.815    3055-3055/com.example.app E/WindowManager﹕ android.view.WindowLeaked: Activity com.example.app.ArticlesActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{1a183701 V.E..... R....... 0,0-1026,640} that was originally added here
        at android.view.ViewRootImpl.<init>(ViewRootImpl.java:363)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:261)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
        at android.app.Dialog.show(Dialog.java:298)
        at com.example.app.BaseActivity.showErrorDialog(BaseActivity.java:145)
        at com.example.app.BaseActivity.onCreate(BaseActivity.java:57)
        at com.example.app.ArticlesActivity.onCreate(ArticlesActivity.java:30)
        at android.app.Activity.performCreate(Activity.java:5933)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
        at android.app.ActivityThread.access$800(ActivityThread.java:144)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

您可能希望扩展DialogFragment。在OnCreateDialog(),您将返回AlertDialog。您使用show()显示片段,然后使用dismiss()关闭。这可以保证不泄漏。

答案 1 :(得分:2)

我会在对话框类中声明一个接口,让活动实现该接口。然后在活动中设置一个公共方法,对话框可以调用该方法并传递结果。

如果确定,你需要完成/退出活动,而不是直接调用结束的对话框,它只会调用公共方法,活动中的方法实际上将完成活动。

请参阅此链接了解如何完成此操作 - How to get button clicks in host fragment from dialog fragment

http://developer.android.com/training/basics/fragments/communicating.html

答案 2 :(得分:0)

我明白了。实际上有两个对话框。其中一个我解雇了,第二个还在,这就是我得到错误的原因。谢谢你们,你们给了我很有价值的信息。