活动泄漏了窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0,最初是在此处添加的。

8
我遇到了这个错误:已经泄露的窗口com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0最初是在这里添加的。 我在模拟器中有网络连接,可以通过打开网站来检查它。 我在进程对话框的行上遇到了错误。
@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 - Pragnani
可能应用程序崩溃是因为您正在尝试从“doInBackground”更新UI元素,因此请改用“onPostExecute”来更新UI元素,而不是使用“doInBackground”。 - ρяσѕρєя K
是的,没错...它之所以显示是因为在doInBackground中有UI元素...非常感谢。 - Jeeten Parmar
2个回答

51
如果您的活动已被销毁但仍在显示对话框,则会发生此错误。 因此,您需要将以下代码添加到活动的onDestroy()中。
@Override
public void onDestroy() {
    super.onDestroy();
    if (dialog != null) {
        dialog.dismiss();
        dialog = null;
    }
}

应用程序崩溃了,我试图从doInBackground更新UI元素。 - Jeeten Parmar
你不能从另一个后台线程更改UI。尝试从postExecute更改。 - vicky
rite,vivek。但是为什么当我没有向我的计算机本地服务器发送数据时它却能工作呢?我已经将它更改为公司的主服务器,只有在那个时候,我才收到了这个错误。 - Jeeten Parmar
1
首先应该调用 super.onDestroy() - Johan S
感谢Johan S,我确认你是正确的:)。我已经误解了很长时间。 - buptcoder
哈哈,我很惊讶你知道为什么...我没有声明对话框,当我在销毁时使用它...我的问题得到了解决,谢谢。 - Ahmad Arslan

2
也许是因为你的写作方式造成的
textValidation.setText(e.toString());

在函数内部,

doInBackground()

这是在doInBackground()方法中允许更新UI的方式。如果您将此行放置在postExecute()中,那么就可以解决这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接