我无法将我的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类,那将非常感激。
答案 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);
}