activity 完成时 AlertDialog 导致泄漏
AlertDialog causes leaks when activity finishes
我有一个扩展 FragmentActivity
的基础 Activity。在此 activity 中,我有一个带有“确定”按钮的对话框。对话框显示没有互联网连接。用户单击按钮后,activity 完成。
我知道在退出 activity 之前,我必须在 AlertDialog
对象上调用 dismiss
。我尝试通过两种方式做到这一点:在 DialogInterface.OnClickListener
对象
的 onClick
方法中
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
BaseActivity.this.finish();
}
});
在我意识到之前的代码不起作用后,我尝试在我的 BaseActivity class 中创建一个成员变量并调用 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.access0(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)
预先感谢您的帮助。
您可能希望扩展 DialogFragment
。在 OnCreateDialog()
中,您将 return 您的 AlertDialog
。您使用 show()
显示片段并使用 dismiss()
关闭。这样可以保证没有泄漏。
我会在对话框 class 中声明一个接口,然后让 activity 实现该接口。然后在 activity 中设置一个 public 方法,你的对话框可以调用它并传递结果。
如果确定您需要完成/退出 activity,而不是直接调用结束的对话框,它只会调用 public 方法和 public 中的那个方法=20=] 实际上会完成 activity.
请参阅此 link 以了解如何完成 -
How to get button clicks in host fragment from dialog fragment
http://developer.android.com/training/basics/fragments/communicating.html
我想通了。实际上有两个对话。我解雇了其中一个,而第二个仍然存在,这就是我收到错误的原因。谢谢你们,你们给了我宝贵的信息让我思考。
我有一个扩展 FragmentActivity
的基础 Activity。在此 activity 中,我有一个带有“确定”按钮的对话框。对话框显示没有互联网连接。用户单击按钮后,activity 完成。
我知道在退出 activity 之前,我必须在 AlertDialog
对象上调用 dismiss
。我尝试通过两种方式做到这一点:在 DialogInterface.OnClickListener
对象
onClick
方法中
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
BaseActivity.this.finish();
}
});
在我意识到之前的代码不起作用后,我尝试在我的 BaseActivity class 中创建一个成员变量并调用 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.access0(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)
预先感谢您的帮助。
您可能希望扩展 DialogFragment
。在 OnCreateDialog()
中,您将 return 您的 AlertDialog
。您使用 show()
显示片段并使用 dismiss()
关闭。这样可以保证没有泄漏。
我会在对话框 class 中声明一个接口,然后让 activity 实现该接口。然后在 activity 中设置一个 public 方法,你的对话框可以调用它并传递结果。
如果确定您需要完成/退出 activity,而不是直接调用结束的对话框,它只会调用 public 方法和 public 中的那个方法=20=] 实际上会完成 activity.
请参阅此 link 以了解如何完成 - How to get button clicks in host fragment from dialog fragment
http://developer.android.com/training/basics/fragments/communicating.html
我想通了。实际上有两个对话。我解雇了其中一个,而第二个仍然存在,这就是我收到错误的原因。谢谢你们,你们给了我宝贵的信息让我思考。