创建Async任务类,该类返回已解析的XML URL的结果

时间:2013-06-27 21:57:29

标签: android xml-parsing android-asynctask

我无法将我的XML解析代码转换为异步任务类,我想知道是否有人可以帮我提供一个如何将它整合在一起的示例。我正在使用Android Google地图演示代码,我想从包含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());

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

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

如果有人可以展示并解释如何创建执行此类操作的Async类,那将非常感激。

2 个答案:

答案 0 :(得分: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是成员变量,您将可以访问它。这可能不是完整的代码,但会让你知道如何做到这一点。根据您的设置,您可能需要调整一些内容。

如果您不希望用户在发生这种情况时能够执行任何其他操作,那么您可能需要在ProgressBar中添加onPreExecute()并在dismiss()中添加onPostExecute() 1}}

答案 1 :(得分: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);
}