这是什么错误,为什么会发生?
05-17 18:24:57.069: ERROR/WindowManager(18850): Activity com.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): android.view.WindowLeaked: Activity ccom.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.ViewRoot.<init>(ViewRoot.java:231)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.Window$LocalWindowManager.addView(Window.java:424)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.Dialog.show(Dialog.java:239)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.mypkg.myP$PreparePairingLinkageData.onPreExecute(viewP.java:183)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.os.AsyncTask.execute(AsyncTask.java:391)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.mypkg.myP.onCreate(viewP.java:94)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.access$2200(ActivityThread.java:126)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.os.Handler.dispatchMessage(Handler.java:99)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.os.Looper.loop(Looper.java:123)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.main(ActivityThread.java:4595)
05-17 18:24:57.069: ERROR/WindowManager(18850): at java.lang.reflect.Method.invokeNative(Native Method)
05-17 18:24:57.069: ERROR/WindowManager(18850): at java.lang.reflect.Method.invoke(Method.java:521)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-17 18:24:57.069: ERROR/WindowManager(18850): at dalvik.system.NativeStart.main(Native Method)
您试图退出活动后显示对话框。
[编辑]
这个问题是 android 开发人员在 Google 上搜索最多的问题之一,因此在评论中添加了一些要点,而无需深入地进行评论对话,这可能对将来的研究者更有帮助。
答案 1 :
您试图退出活动后显示对话框。
答案 2
在某些情况下(尽管答案仍然是完全正确的),该错误可能会引起误解 - 例如,在我的情况下,在 AsyncTask 中引发了未处理的 Exception,这导致 Activity 关闭,然后打开进度对话框导致了此 Exception。 “真正的” 异常在日志中稍早一些
答案 3
在退出 Activity 之前,在您创建的 Dialog 实例上调用 dismiss(),例如在 onPause()或 onDestroy()中
解决方案是在退出Activity
之前,在viewP.java:183
dismiss()
,在viewP.java:183
创建的Dialog
上调用dismiss()
onPause()
。离开 “ Activity
之前,应关闭所有 “ Window
和 “ Dialog
。
如果使用AsyncTask
,则该日志消息可能具有欺骗性。如果您在日志中查找,则可能会发现另一个错误,可能是AsyncTask
doInBackground()
方法中的一个错误,这使您当前的Activity
doInBackground()
,因此,一旦AsyncTask
回来。休息。其他一些用户已经在这里解释了:-)
我通过在AlertDialog
上错误地调用hide()
而不是dismiss()
触发了此错误。
您可以通过一个简单 / 愚蠢的错误来获取此异常,例如,如果您错过了 switch 语句中的 break 调用语句,则在显示AlertDialog
之后意外地调用finish()
……
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.new_button:
openMyAlertDialog();
break; <-- If you forget this the finish() method below
will be called while the dialog is showing!
case R.id.exit_button:
finish();
break;
}
}
finish()
方法将关闭Activity
,但AlertDialog
仍在显示!
因此,当您专心盯着代码,寻找不良的线程问题或复杂的编码等时,请不要对树木视而不见。有时,它就像丢失的 break 语句一样简单而愚蠢。 :)
退出活动后尝试显示对话框时会出现此问题。
我只是通过写下以下代码解决了这个问题:
@Override
public void onDestroy(){
super.onDestroy();
if ( progressDialog!=null && progressDialog.isShowing() ){
progressDialog.cancel();
}
}
基本上,从哪个类启动 progressDialog,重写 onDestroy 方法并执行此方法。它解决了 “活动已泄漏窗口” 的问题。
我最近遇到了同样的问题。
此问题背后的原因是,该活动在关闭对话框之前已关闭。发生上述情况的原因多种多样。上面帖子中提到的内容也是正确的。
我陷入困境,因为在线程中,我正在调用一个引发异常的函数。因此,窗口被关闭了,因此是例外。
活动销毁时关闭对话框
@Override
protected void onDestroy()
{
super.onDestroy();
if (pDialog!=null && pDialog.isShowing()){
pDialog.dismiss();
}
}
这可能会有所帮助。
if (! isFinishing()) {
dialog.show();
}