android - 最初添加的Activity有泄漏的窗口

  显示原文与译文双语对照的内容

这是什么错误,为什么会发生?


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)

时间:

上的解决方法是调用 dismiss()DialogviewP.java:183 中创建,然后再退出这里 Activity,比如 onPause() 中。 所有 Window s& Dialog 应该在离开 Activity 之前关闭。

如果你使用的是 AsyncTask,那么日志消息可能是欺骗的。 如果你寻找在你的日志,你可能会找到另一个错误,可能是一台,就在你的AsyncTaskdoInBackground() 方法,也就是使当前 Activity 来放大看,因而一旦 AsyncTask 就恢复了- - 你知道剩下的。 其他用户已经在这里解释过:- )

在 switch 语句中。., 有之后则可以产生该异常由( 例如) 意外地调用 finish() 通过只是一个简单的/哑错误,将显示一条 AlertDialog,如果你错过一个中断调用的声明


 @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语句。 : )

我是有同样的问题,并且能找到这个网站,并且,当我的处境是不同的我打电话给前完成从一个if块本文定义的警告框。 这么简单地调用忽略的警告框的volovoy ( 因为还没有做) 也不起作用,但在阅读完阿历克斯的答案和实现它是导致它的完成在这个页面里面我试图添加一个返回语句后立即返回,如果块,而且修复了问题。 我以为一旦你叫完完成它就会停止一切并立刻结束。 但它不存在,似乎转到代码块的结尾,然后结束。 所以如果你想实现一个状况有时会在做一些代码你也总得放一个返回语句之前,文档也将完成正确完成或者它将继续进行中和并就类似于终点被调用后的代码块的末尾处并没有在原地先动手 这就是为什么我得到了所有奇怪的错误。


private picked(File aDirectory)
{
 if(aDirectory.length()==0){setResult(RESULT_CANCELED, new Intent()); finish(); return;}
 AlertDialog.Builder alert= new AlertDialog.Builder(this);//Start dialog builder
 alert.setTitle("Question").setMessage("Do you want to open that file?"+aDirectory.getName());
 alert.setPositiveButton("OK", okButtonListener).setNegativeButton("Cancel", cancelButtonListener);
 alert.show();
}

如果你没有写寄件人先等我完成之后再通过调用它那里,它将作为如果我调用 alert.show(); 因而就说我走漏的窗口,通过精加工后不久出现我打的对话框出现,即使情况不是这样它仍然认为,对。 我以为我会加上这个它来完成命令选择了不同的举动,因为这显示了那我不是这样做,我想大概是有其他那些认为不同于之前的我我发现这个。

当你退出 Activity 后试图显示对话框时出现这里问题。

我只是通过写下以下代码来解决这个问题:


@Override
public void onDestroy(){
 super.onDestroy();
 if ( progressDialog!=null && progressDialog.isShowing() ){
 progressDialog.cancel();
 }
}

基本上,从你启动progressDialog的类开始,覆盖onDestroy方法并这样做。 它解决了"Activity 已经泄露窗口"问题。

...