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

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)

当前回答

不仅尝试显示警报,而且当您完成一个特定的活动实例并尝试启动新的活动/服务或尝试停止它时,还可以调用它。

例子:

OldActivity instance;

    oncreate() {
       instance=this;
    }
    instance.finish();
    instance.startActivity(new Intent(ACTION_MAIN).setClass(instance, NewActivity.class));

其他回答

你可以通过一个简单的/愚蠢的错误得到这个异常,通过(例如)在显示AlertDialog后不小心调用finish(),如果你错过了switch语句中的break call语句……

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

您试图在退出活动后显示一个对话框。

(编辑)

这个问题是谷歌上android开发者搜索最多的问题之一, 因此,从评论中添加一些重要的观点,这可能对未来的调查人员更有帮助,而不需要深入评论对话。

答案1:

您试图在退出活动后显示一个对话框。

回答2

在某些情况下,这个错误可能会有点误导(尽管 答案仍然是完全准确的)-即在我的情况下,一个 在AsyncTask中抛出了unhandled异常,这导致 活动关闭,然后一个打开的progressdialog导致了这一点 异常. .所以'real'异常在日志中稍早一些

回答3

在退出前创建的Dialog实例上调用dismiss() 活动,例如在onPause()或onDestroy()中

我使用的是Jetpack Compose,没有对话,所以这些答案大部分都不适用于我。结果是我在Kotlin协程中访问了超出范围的数组索引。 我在try和catch中封装了所有协程调用。

try {
     viewModelScope.launch(Dispatchers.IO) {
     ....
     }
} catch (e: Exception) {
     Log.e("Exception: ", e.message.toString())
}

最后发现了错误(或者我应该说我的错误:P)。

解决方案是在退出Activity之前在view .java:183中创建的对话框上调用dismiss(),例如在onPause()中。所有的窗口和对话框应该在离开一个活动之前关闭。

你必须在AsyncTask的onPreExecute方法中创建Progressdialog对象,你应该在onPostExecute方法中解散它。