【问题标题】:Activity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0 that was originally added hereActivity 泄露了最初添加在这里的窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0
【发布时间】:2013-05-22 01:08:05
【问题描述】:

我收到此错误:已泄漏窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0 最初添加在此处 我在模拟器中有网络连接,通过打开网站查看浏览器。

我在 processdialog 行遇到错误。

@SuppressLint("NewApi")
private class TheTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        dialog = ProgressDialog.show(Register.this, "",
                "Registering... Please wait...", true);
    }

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

        request = new SoapObject(NAMESPACE, METHOD_NAME);

        name = new PropertyInfo();
        name.setName("Name");
        name.setValue(Name);
        name.setType(String.class);
        request.addProperty(name);

        SoapSerializationEnvelope envp = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envp.dotNet = true;
        envp.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        try {
            androidHttpTransport.call(SOAP_ACTION, envp);
            SoapPrimitive response = (SoapPrimitive) envp.getResponse();
            Response = response.toString();

        } catch (Exception e) {
            textValidation.setText(e.toString());
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

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

【问题讨论】:

  • 请将Void改为void
  • 可能应用程序崩溃是因为您试图从 doInBackground 更新 UI 元素所以使用 onPostExecute 来更新 ui 元素而不是 doInBackground
  • 是的,仪式……它显示了来自 doInBackground 的 UI 元素的 bcz……非常感谢。

标签: android progressdialog


【解决方案1】:

如果您的活动已被销毁但您的对话框仍在显示,则会发生此错误。 所以你已经在你的活动的onDestroy()中添加了这些代码

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

【讨论】:

  • 应用程序崩溃我试图从 doInBackground 更新 UI 元素。
  • U 不能从另一个后台线程更改 UI。尝试从 postExecute 更改
  • 仪式,vivek。但是,为什么当我没有将数据发送到我的计算机本地服务器时它正在工作。我已将其更改为我公司的主服务器,但只有那一次,我收到了这个错误。
  • super.onDestroy() 应该首先被调用。
  • 感谢 Johan S,我确认您是对的 :)。我已经误解了很长时间了。
【解决方案2】:

可能是因为你在写作

textValidation.setText(e.toString());

函数内部,

doInBackground()

正在更新 android 在 doInBackground() 方法中允许的 UI。所以如果你把这条线放进去

postExecute()

那么这个问题就会得到解决。

【讨论】:

    最近更新 更多