【问题标题】:onPostExecute called only when call to another void is not present仅当不存在对另一个 void 的调用时才调用 onPostExecute
【发布时间】:2013-04-07 10:54:09
【问题描述】:

我有以下onPostExecute 代码用于AsyncTask。它按原样运行良好。但是,当我删除注释的代码时,我从未收到 onPostExecute 事件(无 Toast)。

@Override
protected void onPostExecute(String result) {
      internetData = result;        
      tempview.append(result + "\n");
      Toast.makeText(getApplicationContext(), internetData.toString(), 1).show();
      //setServiceId();
}

setServiceId 事件和后续事件是(故意删除 URL),GetXMLData 是我的AsyncTask

public void setServiceId() {
    if (internetData != null) {
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser xpp = factory.newPullParser();

            xpp.setInput(new StringReader(internetData));
            int eventType = xpp.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                if (eventType == XmlPullParser.TEXT) {
                    serviceId = xpp.getText();
                    serviceHistory = "www.google.com/" + serviceId + "/history";
                    serviceUsage = "www.google.com/" + serviceId + "/usage";
                    serviceDetails = "www.google.com/" + serviceId + "/service";
                    Toast.makeText(getApplicationContext(), serviceId, 1).show();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    updateHistory();
    updateDetails();
    updateUsage();
}

public void updateHistory() { //Never called
    new GetXMLData().execute(serviceHistory);
    Toast.makeText(getApplicationContext(), "Update History", 1).show();
}

public void updateUsage() { //Never called
    new GetXMLData().execute(serviceUsage);
    Toast.makeText(getApplicationContext(), "Update Usage", 1).show();
}

public void updateDetails() { //Never called
    new GetXMLData().execute(serviceDetails);
    Toast.makeText(getApplicationContext(), "Update Details", 1).show();
}

    public void updateData() { //First call
    new GetXMLData().execute(serviceListing);
    Toast.makeText(getApplicationContext(), "Update Data", 1).show();
}

上面的最后一个事件,updateData 被调用,当setServiceId 事件未被注释掉时,Toast 似乎永远不会消失。除此之外,不会检索 XML 数据。

当它被注释掉时,我收到了 updateData() 事件的 XML 数据,但没有后续事件,并且我没有从 onPostExecute 获得 Toast。关于为什么会发生这种情况的任何建议?

【问题讨论】:

  • while (eventType != XmlPullParser.END_DOCUMENT) 如果eventType != XmlPullParser.END_DOCUMENT 无限循环。您需要在循环内更改 eventType。
  • +1 表示上述评论。在该 while 循环中使用 xpp.getNextTag() 或 xpp.getNext()。
  • @andrew_pako 你先生,是对的......我觉得很傻:D
  • @andrew_pako 如果你回答我会接受。
  • 您真的不应该在 onPostExecute() 中进行 XML 解析,因为此方法在 UI 线程上运行。您的 XML 解析应该在 doInBackground() 中完成,并且您应该只在 onPostExecute() 中更新 UI。这不是您的问题的原因,但如果您将繁重的 XML 解析操作保持在 UI 线程之外,它将有助于您的应用程序感觉更灵敏。

标签: android android-asynctask void


【解决方案1】:

您的 while 循环条件实际上有一个错误,它将无限循环并使您的应用程序挂起:

    while (eventType != XmlPullParser.END_DOCUMENT) {
        if (eventType == XmlPullParser.TEXT) {
            serviceId = xpp.getText();
            serviceHistory = "www.google.com/" + serviceId + "/history";
            serviceUsage = "www.google.com/" + serviceId + "/usage";
            serviceDetails = "www.google.com/" + serviceId + "/service";
            Toast.makeText(getApplicationContext(), serviceId, 1).show();
        }
    }

在循环中添加下一行:

    eventType = xpp.next();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    相关资源
    最近更新 更多