【问题标题】:android.view.WindowLeakedandroid.view.WindowLeaked
【发布时间】:2012-07-20 09:09:16
【问题描述】:
inviteBu.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(ChoiceList.size()>0)
             {

                    LayoutInflater factory = LayoutInflater.from(MobileConnectActivity.this);
                    final View textEntryView = factory.inflate(R.layout.invite_dialog, null);
                    final EditText et =(EditText) textEntryView.findViewById(R.id.usercontent_edit);

                   dia= new AlertDialog.Builder(MobileConnectActivity.this)
                        .setTitle(getString(R.string.invite_input_content))
                        .setView(textEntryView)
                        .setPositiveButton(getString(R.string.invite_send), new DialogInterface.OnClickListener() {
                            public void onClick(final DialogInterface dialog, int whichButton) {
                                dialog.dismiss();
                                 if(et.getText().toString()==null && et.getText().equals("") )
                                {
                                    Toast.makeText(getApplicationContext(), getString(R.string.invite_content_check), Toast.LENGTH_SHORT).show();
                                }
                                 else{


                                     new AsyncTask<Void, Void, String>() {

                                         CustomDialog mProgressBar = new CustomDialog(MobileConnectActivity.this, R.style.dialog);

                                        protected void onPreExecute() {

                                            mProgressBar.show();
                                        };

                                        protected void onCancelled() {
                                            mProgressBar.hide();
                                        };

                                        @Override
                                        protected String doInBackground(Void... params) {

                                                ChoiceList=removeDuplicateList(ChoiceList);
                                                for(int i=0;i<ChoiceList.size();i++)
                                                {
                                                    Log.i("aaa",""+ChoiceList.get(i));
                                                    sendSMS(ChoiceList.get(i), et.getText().toString());
                                                }
                                            return "OK";
                                        }

                                        protected void onPostExecute(String response) {
                                            mProgressBar.hide();

                                            if (response != null ) {

                                                 Toast.makeText(getApplicationContext(), getString(R.string.invite_succeed), Toast.LENGTH_SHORT).show();
                                                 Intent intent = new Intent();
                                                    intent.setClass(MobileConnectActivity.this, inviteMainActivity.class);
                                                    startActivity(intent);

                                                MobileConnectActivity.this.finish();
                                            } else {
                                                //mHelper.showResponseErrorMessage(response);
                                                Intent intent = new Intent();
                                                intent.setClass(MobileConnectActivity.this, inviteMainActivity.class);
                                                startActivity(intent);
                                                finish();
                                            }

                                        };

                                    }.execute();

                                 }

                            }
                        })
                        .setNegativeButton(getString(R.string.invite_cancel), new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {

                                /* User clicked cancel so do some stuff */
                            }
                        }).show();

             }
            else
            {
                Toast.makeText(getApplicationContext(), getString(R.string.invite_choice_check), Toast.LENGTH_SHORT).show();
            }
        }
    });

它给我:

07-21 03:36:24.519: E/WindowManager(23240): Activity com.portaura.myaura.invite.MobileConnectActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@405c32d0 that was originally added here
07-21 03:36:24.519: E/WindowManager(23240): android.view.WindowLeaked: Activity com.portaura.myaura.invite.MobileConnectActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@405c32d0 that was originally added here
07-21 03:36:24.519: E/WindowManager(23240):     at android.view.ViewRoot.<init>(ViewRoot.java:266)
07-21 03:36:24.519: E/WindowManager(23240):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:174)
07-21 03:36:24.519: E/WindowManager(23240):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:117)
07-21 03:36:24.519: E/WindowManager(23240):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
07-21 03:36:24.519: E/WindowManager(23240):     at android.app.Dialog.show(Dialog.java:241)
07-21 03:36:24.519: E/WindowManager(23240):     at com.portaura.myaura.invite.MobileConnectActivity$3$1$1.onPreExecute(MobileConnectActivity.java:161)
07-21 03:36:24.519: E/WindowManager(23240):     at android.os.AsyncTask.execute(AsyncTask.java:391)
07-21 03:36:24.519: E/WindowManager(23240):     at com.portaura.myaura.invite.MobileConnectActivity$3$1.onClick(MobileConnectActivity.java:201)
07-21 03:36:24.519: E/WindowManager(23240):     at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:165)
07-21 03:36:24.519: E/WindowManager(23240):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-21 03:36:24.519: E/WindowManager(23240):     at android.os.Looper.loop(Looper.java:130)
07-21 03:36:24.519: E/WindowManager(23240):     at java.lang.reflect.Method.invokeNative(Native Method)
07-21 03:36:24.519: E/WindowManager(23240):     at java.lang.reflect.Method.invoke(Method.java:507)

【问题讨论】:

标签: android


【解决方案1】:

窗口泄漏异常通常是由未正确关闭的对话框引起的。 即,如果您打算在 asynctask 的 Onpostexecute 中关闭一个对话框,并且创建它的活动已经结束,它将引发窗口泄漏。确保在活动的 onPause 中关闭对话框。

【讨论】:

  • @pengwang 这不是答案吗?
  • 对于出现此错误的其他人:还要确保查找此错误之上的错误。应用程序在对话框打开时崩溃将在导致应用程序崩溃的实际错误之后导致此错误。
  • 这些异常会导致应用崩溃吗?
  • 如果我从不关闭对话框,它会永远保持打开状态吗?我在“加载”对话框中遇到了类似的错误,但如果我关闭该对话框,那么它实际上不会出现在屏幕上。
【解决方案2】:

每当您启动 ProgressDialog 时,都应该在后台任务完成后正确关闭,甚至取消后台运行任务。所以,

mProgressBar.dismiss();代替mProgressBar.hide();

你不会得到 android.view.WindowLeaked 错误

希望对你有帮助

【讨论】:

  • 为我工作,谢谢
【解决方案3】:

检查你是否在 mDialog.show() 函数之前使用了 finish() 函数。如果是去掉finish(),在show()后面加上。

【讨论】:

    【解决方案4】:

    当您错过此代码时:mProgressDialog.dismis(); 到时候您可能会收到此类错误。

    【讨论】:

      【解决方案5】:

      发生此错误的另一种情况是应用程序在显示对话框时崩溃。查看此错误上方的其他错误。

      【讨论】:

        【解决方案6】:

        onStop()onDestroy() 回调中,使用dialogName.dismiss(); 关闭对话框

        还要进行空值检查。那就是:

        if (dialogName != null) {
            dialogName.dismiss();
        }
        

        【讨论】:

          【解决方案7】:

          问题是 AsyncTask

          new AsyncTask<Void, Void, String>() {
          
              CustomDialog mProgressBar = new CustomDialog(MobileConnectActivity.this, R.style.dialog);
              .... 
          }
          

          您在异步任务中创建了一个进度条,当您移动到另一个活动时会出现问题。

          为此在dismiss或show()之前

          if(!isFinishing() && dialog != null) { dialog.dismiss();}
          

          isFinishing()

          的用法
           * Check to see whether this activity is in the process of finishing,
           * either because you called {@link #finish} on it or someone else
           * has requested that it finished.  This is often used in
           * {@link #onPause} to determine whether the activity is simply pausing or
           * completely finishing.
           *
           * @return If the activity is finishing, returns true; else returns false.
          

          【讨论】:

            【解决方案8】:

            仅仅关闭对话框并不足以消除我的错误。事实证明,即使在对话框被解除后,我的代码仍保留对对话框的引用。对我来说,关键是在关闭对话框后将该引用设置为 null。

            【讨论】:

              【解决方案9】:

              对我来说问题正在发生,因为我使用 android:noHistory="true" 来处理导致问题的活动,并且它只发生在 Android 6.0 API 23 上。

              【讨论】:

                猜你喜欢
                • 2014-08-24
                • 1970-01-01
                • 2018-04-09
                • 1970-01-01
                • 1970-01-01
                • 2018-06-15
                • 1970-01-01
                • 1970-01-01
                • 2018-05-24
                相关资源
                最近更新 更多