1

我在将我的 XML 解析代码转换为异步任务类时遇到了麻烦,我想知道是否有人可以帮助我举个例子来说明如何将它们组合在一起。我正在使用 Android Google Maps 演示代码,我想从包含 XML 的 URL 中解析一个值,并在我触摸地图时显示它。地图触摸代码如下所示。

@Override
public void onMapClick(LatLng point) {
    /*
    .......Code......
    */
    mTapTextView.setText("tapped, point=" + new AsyncClass().execute(xmlURL));
}

这是从包含 XML 的 URL 解析我想要的值的代码...

double price = 0;

URL xmlContent= new URL("http://www.fueleconomy.gov/ws/rest/fuelprices");
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = db.parse(new InputSource(xmlContent.openStream()));
NodeList fuel = doc.getElementsByTagName("midgrade");
Element grade = (Element) fuel.item(0);
price = Double.parseDouble(grade.getTextContent());

我希望在异步任务类中返回变量“价格”,这样我就可以在这行代码中调用该类,从而返回值并在触摸屏幕时显示它......

mTapTextView.setText("tapped, point=" + new AsyncTaskClass().execute(xmlURL));

如果有人可以展示并解释如何创建一个执行此类操作的 Async 类,将不胜感激。

4

2 回答 2

1

这是一个例子AsyncTask

public class TalkToServer extends AsyncTask<URL, Void, Double> {
@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected void onProgressUpdate(URL... values) {
    super.onProgressUpdate(values);

}

@Override
protected String doInBackground(String... params) {
//do your work here
    return something;
}

@Override
protected void onPostExecute(Double result) {
    super.onPostExecute(result);
       // do something with data here-display it or send to mainactivity
mTapTextView.setText("tapped, point=" + String.valueOf(result));

}

把你所有的解析都放进去,doInBackground()然后返回那个值onPostExecute()。在那里你可以调用setText(result);你的TextView.

AsyncTask从您onClick()或您需要的任何地方打电话给您

TalkToServer task = new TalkToServer();  // in case you need a constructor with params
task.execute(xmlURL);

假设这是您的内部类MainActivity并且mTapTextView是成员变量,您将可以访问它。这可能不是完整的代码,但可以让您很好地了解如何执行此操作。根据您的设置,您可能需要调整几件事。

如果您不希望用户在发生这种情况时能够做任何其他事情,那么您可能需要添加一个ProgressBarinonPreExecute()dismiss()onPostExecute()

于 2013-06-27T22:01:26.480 回答
1

异步的重点是启动它,通常是作为一些 UI 操作的结果,然后让它在后台运行,最后在完成时更新 UI(在 UI 线程上)。这

mTapTextView.setText("tapped, point=" + new AsyncClass().execute(xmlURL));

看起来您正在尝试在单击地图时执行异步任务,并立即返回结果以显示在mTapTextView. 尝试这样的事情:

 private class AsyncTaskClass extends AsyncTask<URL, Void, Double> {
     protected Double doInBackground(URL... urls) {
         DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
         Document doc = db.parse(new InputSource(urls[0].openStream()));
         NodeList fuel = doc.getElementsByTagName("midgrade");
         Element grade = (Element) fuel.item(0);
         return Double.parseDouble(grade.getTextContent());         
     }

     protected void onPostExecute(Double price) {
         mTapTextView.setText("tapped, point=" + price);  // TODO: probably a typo in your string literal?
     }
 }

然后像这样使用它:

@Override
public void onMapClick(LatLng point) {
    /*
    .......Code......
    */
    URL xmlURL = new URL("http://www.fueleconomy.gov/ws/rest/fuelprices");
    new AsyncTaskClass().execute(xmlURL);
}
于 2013-06-27T22:04:31.033 回答