活动已泄露最初添加的窗口

时间:2010-05-17 15:51:24

标签: android memory-leaks dialog

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

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)

44 个答案:

答案 0 :(得分:1422)

您在退出活动后尝试显示对话框。

<强> [编辑]

这个问题是google for android开发者的热门搜索之一, 因此,从评论中添加一些重要的观点,这可能对未来的调查人员更有帮助,而无需进行深入的评论对话。

回答1

  

您在退出活动后尝试显示对话框。

回答2

  

在某些情况下,这个错误可能会有点误导(尽管如此   答案仍然是完全准确的) - 即在我的情况下   未处理的异常被抛入AsyncTask,导致了   要关闭的活动,然后打开progressdialog导致这个   例外..所以“真正的”例外在日志中稍早一点

回答3

  

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

答案 1 :(得分:385)

解决方法是在退出dismiss()之前致电Dialog您在viewP.java:183创建的Activity,例如在onPause()。在离开Window之前,应关闭所有Dialog s&amp; Activity

答案 2 :(得分:106)

如果您使用AsyncTask,可能该日志消息可能具有欺骗性。如果您在日志中查找,可能会发现另一个错误,可能是您doInBackground()的{​​{1}}方法中的一个错误,即您当前的AsyncTask爆炸,因此Activity回来了..好吧,你知道其余的。其他一些用户已经解释过: - )

答案 3 :(得分:59)

我错误地在hide()上调用dismiss()而不是AlertDialog来触发此错误。

答案 4 :(得分:53)

如果你错过了switch语句中的break调用语句,你可以通过(例如)在显示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仍在显示!

因此,当你专心盯着代码,寻找糟糕的线程问题或复杂的编码等时,不要忽视森林中的树木。有时它可能只是一个简单而愚蠢的东西,就像一个缺失的断言。 :)

答案 5 :(得分:31)

在您退出活动后尝试显示对话框时会出现此问题。

我刚刚通过写下以下代码解决了这个问题:

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

基本上,从哪个类开始progressDialog,覆盖onDestroy方法并按此方式执行。它解决了“活动已经泄露窗口”的问题。

答案 6 :(得分:25)

这个问题的答案都是正确的,但对我来说实际理解为什么有些困惑。玩了大约2个小时后,这个错误的原因(在我的情况下)打了我:

通过阅读其他答案,您已经知道有X has leaked window DecorView@d9e6131[]错误意味着当您的应用关闭时对话框已打开。但为什么呢?

可能是您的应用在对话框打开时出于其他原因而崩溃

由于您的代码中存在一些错误,导致您的应用关闭,导致对话框因应用程序因其他错误而关闭的同时保持打开状态。

所以,看看你的逻辑。解决第一个错误,然后第二个错误将自行解决enter image description here

一个错误导致另一个错误,导致另一个错误,如DOMINOS!

答案 7 :(得分:19)

我最近遇到了同样的问题。

此问题背后的原因是在关闭对话框之前关闭了活动。 上述情况有多种原因。上面帖子中提到的那些也是正确的。

我遇到了一种情况,因为在线程中,我正在调用一个抛出异常的函数。因为窗户被解雇,因此是例外。

答案 8 :(得分:13)

这可能有所帮助。

if (! isFinishing()) {

    dialog.show();

    }

答案 9 :(得分:12)

在活动销毁

时关闭对话框
@Override
protected void onDestroy()
{
    super.onDestroy();
    if (pDialog!=null && pDialog.isShowing()){
        pDialog.dismiss();
    }
}

答案 10 :(得分:11)

我在我的视频播放器应用程序中获取这些日志。视频播放器关闭时抛出这些消息。有趣的是,我曾经以随机方式在几次运行中获取这些日志。我的申请也不涉及任何progressdialog。最后,我通过以下实现解决了这个问题。

@Override
protected void onPause()
{
    Log.v("MediaVideo", "onPause");
    super.onPause();
    this.mVideoView.pause();
    this.mVideoView.setVisibility(View.GONE);
}

@Override
protected void onDestroy()
{
    Log.v("MediaVideo", "onDestroy");
    super.onDestroy();
}

@Override
protected void onResume()
{
    Log.v("MediaVideo", "onResume");
    super.onResume();
    this.mVideoView.resume();
}

通过调用OnPause并将mVideoView.pause()设置为visibility来覆盖GONE。这样我就可以解决“Activity has leaked window”日志错误问题。

答案 11 :(得分:11)

我有同样晦涩的错误信息,不知道为什么。根据之前答案的线索,我将我的非GUI调用mDialog.finish()更改为mDialog.dismiss(),错误消失了。这并没有影响我的小部件的行为,但它令人不安,很可能已经标记了一个重要的内存泄漏。

答案 12 :(得分:10)

我遇到了同样的问题并找到了这个页面,虽然我的情况有所不同,但在定义警告框之前,我从finish块调用if

因此,简单地调用dismiss将无效(因为尚未制作)但在阅读 Alex Volovoy的答案并意识到它是导致它的警报框之后。我试图在if块内完成后立即添加一个return语句,并修复了问题。

我想,一旦你打完了它就停止了一切并在那里完成,但事实并非如此。它似乎到了它所在的代码块的末尾然后完成。

所以,如果你想要实现一种情况,有时它会在完成一些代码之前完成,你必须在完成后立即放置一个return语句,否则它将继续运行并且表现得就像在代码块的末尾,而不是您调用它的位置。这就是为什么我得到了所有那些奇怪的错误。

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();之后调用了它,因此它会说你的窗口在你刚完成之后就被泄露了使对话框出现,即使情况并非如此,它仍然认为是。

我想我会在这里添加这个,因为这表明结束命令的行为不同然后我认为它确实如此,我猜有其他人在我发现它之前就像我一样。

答案 13 :(得分:7)

这不是问题的答案,但它与该主题相关。

如果活动在Manifest中定义了一个属性

 android:noHistory="true"

然后在执行onPause()之后,活动的上下文丢失。因此,使用上下文的所有视图都可能会出现此错误。

答案 14 :(得分:6)

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

示例:

OldActivity instance;

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

答案 15 :(得分:5)

当我在ProgressDialog中使用AsyncTask时发生这种情况。实际上我在hide()中使用onPostExecute方法。基于@Alex Volovoy的答案,我需要使用dismiss()ProgressDialog来删除onPostExecute及其完成。

progressDialog.hide(); // Don't use it, it gives error

progressDialog.dismiss(); // Use it

答案 16 :(得分:5)

如果您在doInBackground()函数处出现错误并且拥有此代码,则可以这样做。

尝试最后添加对话框。首先检查并修复doInBackground()功能

protected void onPreExecute() {
     super.onPreExecute();
     pDialog = new ProgressDialog(CreateAccount.this);
     pDialog.setMessage("Creating Product..");
     pDialog.setIndeterminate(false);
     pDialog.setCancelable(true);
     pDialog.show();

 }

 protected String doInBackground(String...args) {
     ERROR CAN BE IS HERE
 }

 protected void onPostExecute(String file_url) {
     // dismiss the dialog once done
     pDialog.dismiss();

答案 17 :(得分:5)

Activity has leaked window that was originally added...有效Activity后尝试显示提醒时,会出现“finished”错误。

您有两种选择AFAIK:

  1. 重新提示您的提醒登录信息:在实际退出您的活动之前,请致电dismiss()上的dialog
  2. dialog放在另一个帖子中并在thread上运行(独立于当前activity)。

答案 18 :(得分:5)

试试这段代码:

public class Sample extends Activity(){
@Override
 public void onCreate(Bundle instance){

}
 @Override
    public void onStop() {
        super.onStop();
      progressdialog.dismiss(); // try this
    }

}

答案 19 :(得分:5)

如果仍然显示ProgressDialog,我在完成活动的问题。

首先隐藏对话框,然后完成活动。

答案 20 :(得分:4)

通常由于进度对话框而出现此问题:您可以在活动中使用以下任一方法解决此问题:

 // 1):
          @Override
                protected void onPause() {
                    super.onPause();
                    if ( yourProgressDialog!=null && yourProgressDialog.isShowing() )
                  {
                        yourProgressDialog.cancel();
                    }
                }

       // 2) :
         @Override
            protected void onDestroy() {
                super.onDestroy();
                if ( yourProgressDialog!=null && yourProgressDialog.isShowing()
               {
                    yourProgressDialog.cancel();
                }
            }

答案 21 :(得分:4)

您必须使用Progressdialog onPreExecute方法制作AsyncTask对象,并且dismiss方法应该onPostExecute

答案 22 :(得分:3)

最佳解决方案是在发生异常时在try catch和dismiss对话框中添加对话框

  

只需使用以下代码

 try {
        dialog.show();
    } catch (Exception e) {
        dialog.dismiss();
    }

答案 23 :(得分:3)

就我而言,原因是我忘了在Android清单文件中包含权限。

我是怎么知道的?好吧,就像@Bobby在接受的答案下面的评论中说的那样,只需向上滚动到你的日志,你就会看到真正抛出异常的第一个原因或事件。显然,消息“活动已泄漏最初添加的窗口”只是一个异常,它是由第一个异常引起的。

答案 24 :(得分:2)

在显示progressbarprogressDialog之前放置最佳解决方案

if (getApplicationContext().getWindow().getDecorView().isShown()) {

  //Show Your Progress Dialog

}

答案 25 :(得分:2)

窗口泄露异常有两个原因:

1)当活动上下文不存在时显示对话框,要解决此问题,您应该只显示对话框,确定活动存在:

if(getActivity()!= null && !getActivity().isFinishing()){
        Dialog.show();
}

2)不要适当地关闭对话框,解决使用此代码:

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

答案 26 :(得分:2)

尝试下面的代码,它会在您解除进度对话框的任何时候都有效,它会看到它的实例是否可用。

try {
        if (null != progressDialog && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

答案 27 :(得分:1)

尝试从后台线程显示Toast时遇到此错误。 它是通过在UI线程上运行与UI相关的代码来解决的

答案 28 :(得分:1)

  if (mActivity != null && !mActivity.isFinishing() && mProgressDialog != null && mProgressDialog.isShowing()) {
        mProgressDialog.dismiss();
    }

答案 29 :(得分:1)

当您想要关闭 AlertDialog,但不想在活动中对其进行引用时,这是一种解决方案。

解决方案要求您在项目中具有 androidx.lifecycle 依赖项(我相信在发表评论时这是一项常见要求)

这使您可以将对话框的关闭委托给外部对象(观察者),并且您不再需要关心它,因为当活动终止时它会自动取消订阅。 (这是证明:https://github.com/googlecodelabs/android-lifecycles/issues/5)。

因此,观察者保留对对话框的引用,而活动保留对观察者的引用。当“ onPause”发生时-观察者关闭对话框,而当“ onDestroy”发生时-活动移除观察器,因此不会发生泄漏(嗯,至少我不再在logcat中看到错误了)

// observer
class DialogDismissLifecycleObserver( private var dialog: AlertDialog? ) : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun onPause() {
        dialog?.dismiss()
        dialog = null
    }
}
// activity code
private fun showDialog() {
        if( isDestroyed || isFinishing ) return
        val dialog = AlertDialog
            .Builder(this, R.style.DialogTheme)
            // dialog setup skipped
            .create()
        lifecycle.addObserver( DialogDismissLifecycleObserver( dialog ) )
        dialog.show()
}

答案 30 :(得分:1)

根据我的问题是你试图在一个活动完成后立即调用一个对话框,所以根据我你可以做的是使用Handler给你一些延迟,你的问题将解决,例如:

 Handler handler=new Handler();
     handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                     dialog.show();
                     //or
                     dialog.dismiss();

                }
            },100);

答案 31 :(得分:1)

由于代码中某处出现了一些异常,请确保您的活动未意外关闭。通常,当活动面临强制关闭doinBackground方法然后asynctask返回onPostexecute方法时,它发生在异步任务中。

答案 32 :(得分:0)

我正在制作一个已经接近4.5万行的科学应用程序,并且我使用异步任务,以便能够按需在用户单击的情况下中断长任务。

因此,有一个响应式用户界面,有时甚至是并行的长任务。

长任务结束后,我需要运行一个例程来管理用户界面。

因此,在异步任务结束时,我执行以下涉及接口的操作,该操作不能直接执行,否则会出错。所以我用

this.runOnUiThread(Runnable { x(...)})   // Kotlin

很多时候,此错误发生在功能x的某个位置。

如果函数x在线程外被调用

              x(...)  // Kotlin

Android Studio将显示带有错误行的调用堆栈,并且很容易在几分钟内解决问题。

由于我的源代码已被驯服,并且没有严重的结构性问题(上面的许多答案都描述了这种错误),所以产生此可怕错误消息的原因更加笼统,重要性不那么重要。

这只是链接到线程的执行中的任何愚蠢错误(例如,访问超出定义长度的向量),如以下示意图示例所示:

           var i = 10                  // Kotlin
           ...
           var arr = Array(5){""}       
           var element = arr[i]       // 10 > 5, it's a index overflow

关于这个愚蠢的错误,Android Studio不幸没有指向它。

我什至认为它是一个错误,因为Android Studio知道它所在的地方有一个错误,但是由于某种未知的原因,它会丢失并给出一条随机消息,与问题完全脱节,即一条奇怪的消息,没有任何提示。

解决方案:在调试器中要逐步运行,直到遇到Android Studio拒绝提供的错误行。

这件事对我来说已经发生过好几次了,我想这是 Android 项目中一个非常普遍的错误。在使用线程之前,我从未遇到过这样的错误。

没有人是绝对可靠的,我们有可能犯一些小错误。在这种情况下,您不能指望Android Studio的直接帮助来发现错误在哪里!

答案 33 :(得分:0)

如果要处理LiveData,请在更新值而不是使用liveData.value = someValue时尝试执行liveData.postValue(someValue)

答案 34 :(得分:0)

在活动销毁之前关闭ProgressBar

@Override
    protected void onDestroy() {
        try {
            if (progressDialog != null)
                progressDialog.dismiss();
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.onDestroy();
    }

答案 35 :(得分:0)

如果只是处理DialogActicity.onConfigurationChanged出现的问题

如果只是处理DialogActivity.onConfigurationChanged的问题

//若`AndroidManifest.xml`中已经配置了`android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize"`则不需要设置该项
//If `android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize"` has been configured in `AndroidManifest.xml`, you do not need to set this item
Acticity/Context.registerComponentCallbacks(object : ComponentCallbacks {
    override fun onConfigurationChanged(newConfig: Configuration) {
        dialog?.dismiss()
    }
    override fun onLowMemory() {
    }
})

onDestroy中远更保险点

on Destroy中销毁更安全

override fun onDestroy() {
    super.onDestroy()
    DialogManager.dismiss()
}

也许这对你有用? https://github.com/javakam/DialogManager

答案 36 :(得分:0)

在 Kotlin 中,这是我用来解决此问题的方法

if (!isFinishing)
   dialog.show()

也许这对你有帮助!

答案 37 :(得分:0)

也许您在活动中使用findViewById而不是dialog.findViewById,然后在OnClickListener实例上设置了null,这很可能导致了原始错误。

答案 38 :(得分:0)

确保致电            this.dialog.show。 (活动)

答案 39 :(得分:0)

我也面临这个问题已经有一段时间但我意识到这不是因为dialog因为ActionMode而导致我ActionMode。因此,如果您在onPause打开时尝试完成活动,则会导致此问题。在您的活动中 private ActionMode actionMode; @Override public void onActionModeStarted(ActionMode mode) { super.onActionModeStarted(mode); actionMode = mode; } @Override protected void onPause() { super.onPause(); if (actionMode != null) actionMode.finish(); } 完成了操作模式。

    function self_added_checkout_fieldsPk1($fields)
      {
         echo '<div class="row" style="text-aign:center">
           <div class="col m4 offset-m4" align="center">
              <ul class="collapsible" data-collapsible="expandable">
                 <li class="">
                      <div class="collapsible-header active"><b>Instagram Account No.1 Details</b></div>
                     <div class="collapsible-body" style="display: none; padding-top: 0px; margin-top: 0px; padding-bottom: 0px; margin-bottom: 0px;">
                    <div class="input-field col s12">
                            Username: <input id="acc1user" name="acc1user" type="text" class="validate" required>
                            Password: <input id="acc1pass" name="acc1pass" type="text" class="validate" required>Account No.1 Audience: <input id="acc1audi" name="acc1audi" type="text" class="validate" required>
        Note: Your Login Credentials will be safe with us do not worry.
                    </div>
                    </div>
              </li>
                </ul>
            </div></div>
    </h1>';}

And similarly many more fields as above
#Order Meta Update code
    /**
     * Update the order meta with field value for Package 1
     */

    add_action( 'woocommerce_checkout_update_order_meta',   'my_custom_checkout_field_update_order_meta' );

    function my_custom_checkout_field_update_order_meta( $order_id ) {

    //Username and Password for 1st Account of Instagram

     if ( ! empty( $_POST['acc1user'] ) ) {
        update_post_meta( $order_id, 'Username1', sanitize_text_field(     $_POST['acc1user'] ) );
        }

    if ( ! empty( $_POST['acc1pass'] ) ) {
        update_post_meta( $order_id, 'Password1', sanitize_text_field(     $_POST['acc1pass'] ) );
        }

    if ( ! empty( $_POST['acc1audi'] ) ) {
        update_post_meta( $order_id, 'Account No.1 Audience', sanitize_text_field( $_POST['acc1audi'] ) );
        }

        if ( ! empty( $_POST['acc2user'] ) ) {
        update_post_meta( $order_id, 'Username2', sanitize_text_field( $_POST['acc2user'] ) );
        }

    if ( ! empty( $_POST['acc2pass'] ) ) {
        update_post_meta( $order_id, 'Password2', sanitize_text_field( $_POST['acc2pass'] ) );
        }

    if ( ! empty( $_POST['acc2audi'] ) ) {
        update_post_meta( $order_id, 'Account No.1]2 Audience', sanitize_text_field( $_POST['acc2audi'] ) );
        }

     if ( ! empty( $_POST['acc3user'] ) ) {
        update_post_meta( $order_id, 'Username3', sanitize_text_field( $_POST['acc3user'] ) );
        }

    if ( ! empty( $_POST['acc3pass'] ) ) {
        update_post_meta( $order_id, 'Password3', sanitize_text_field( $_POST['acc3pass'] ) );
        }

    if ( ! empty( $_POST['acc3audi'] ) ) {
        update_post_meta( $order_id, 'Account No.3 Audience', sanitize_text_field( $_POST['acc3audi'] ) );
        }

    if ( ! empty( $_POST['acc4user'] ) ) {
        update_post_meta( $order_id, 'Username4', sanitize_text_field( $_POST['acc4user'] ) );
      }

    if ( ! empty( $_POST['acc4pass'] ) ) {
        update_post_meta( $order_id, 'Password4', sanitize_text_field( $_POST['acc4pass'] ) );
        }

    if ( ! empty( $_POST['acc4audi'] ) ) {
        update_post_meta( $order_id, 'Account No.4 Audience', sanitize_text_field( $_POST['acc4audi'] ) );
        }

     if ( ! empty( $_POST['acc5user'] ) ) {
        update_post_meta( $order_id, 'Username5', sanitize_text_field( $_POST['acc5user'] ) );
        }
    if ( ! empty( $_POST['acc5pass'] ) ) {
        update_post_meta( $order_id, 'Password5', sanitize_text_field( $_POST['acc5pass'] ) );
        }

    if ( ! empty( $_POST['acc5audi'] ) ) {
        update_post_meta( $order_id, 'Account No.5 Audience', sanitize_text_field( $_POST['acc5audi'] ) );
       }
    if ( ! empty( $_POST['acc6user'] ) ) {
        update_post_meta( $order_id, 'Username6', sanitize_text_field( $_POST['acc6user'] ) );
        }
    if ( ! empty( $_POST['acc6pass'] ) ) {
        update_post_meta( $order_id, 'Password6', sanitize_text_field( $_POST['acc6pass'] ) );
        }
        }

答案 40 :(得分:0)

运行monkey test时我也遇到了WindowLeaked问题.logcat在下面。

android.support.v7.app.AppCompatDelegateImplV7$ListMenuDecorView@4334fd40 that was originally added here
android.view.WindowLeaked: Activity com.myapp.MyActivity has leaked window android.support.v7.app.AppCompatDelegateImplV7$ListMenuDecorView@4334fd40 that was originally added here
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:409)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:312)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
            at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
            at android.view.Window$LocalWindowManager.addView(Window.java:554)
            at android.support.v7.app.AppCompatDelegateImplV7.openPanel(AppCompatDelegateImplV7.java:1150)
            at android.support.v7.app.AppCompatDelegateImplV7.onKeyUpPanel(AppCompatDelegateImplV7.java:1469)
            at android.support.v7.app.AppCompatDelegateImplV7.onKeyUp(AppCompatDelegateImplV7.java:919)
            at android.support.v7.app.AppCompatDelegateImplV7.dispatchKeyEvent(AppCompatDelegateImplV7.java:913)
            at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:241)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2009)
            at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3929)
            at android.view.ViewRootImpl.deliverKeyEvent(ViewRootImpl.java:3863)
            at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3420)
            at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4528)
            at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4506)
            at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4610)
            at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171)
            at android.os.MessageQueue.nativePollOnce(Native Method)
            at android.os.MessageQueue.next(MessageQueue.java:125)
            at android.os.Looper.loop(Looper.java:124)
            at android.app.ActivityThread.main(ActivityThread.java:4898)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
            at dalvik.system.NativeStart.main(Native Method)

我的活动是AppCompatActivity.And我使用活动中的以下代码对其进行了重新调整。

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    // added by sunhang : intercept menu key to resove a WindowLeaked error in monkey-test.
    if (event.getKeyCode() == KeyEvent.KEYCODE_MENU) {
        return true;
    }
    return super.dispatchKeyEvent(event);
}

答案 41 :(得分:0)

我有另一个解决方案,想知道它是否对您有效:而不是在onDestroy中解雇,这似乎是领先的解决方案,我正在扩展ProgressDialog ......

public class MyProgressDialog extends ProgressDialog {

  private boolean isDismissed;

  public MyProgressDialog(Context context) {
    super(context);
  }

  @Override
  public void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    dismiss();
  }

  @Override
  public void dismiss() {
    if (isDismissed) {
      return;
    }
    try {
      super.dismiss();
    } catch (IllegalArgumentException e) {
      // ignore
    }
    isDismissed = true;
  }

这是首选AFAIC,因为您不必将进度对话框作为成员持有,只需触发(显示)并忘记

答案 42 :(得分:0)

我遇到了同样的问题。该错误不在Dialog中,而在EditText中。我试图更改EdittextAssynctask的值。我唯一能解决的就是创建一个新的runnable

runOnUiThread(new Runnable(){
      @Override
      public void run() {
       ...        
      }
    });  

答案 43 :(得分:0)

我正在使用视频播放器的“onError”对话框,而不是发疯(我已经测试了所有这些解决方案)

我选择DialogFragment http://developer.android.com/reference/android/app/DialogFragment.html

您可以在内部DialogFragment课程中返回构建器创建,只需覆盖onCreateDialog