我有一个长时间运行的代码解析XML并在我的UI上更新一些TextView,代码运行良好,但我需要把它放在AsyncTask中,我对Android很新,我试图这样做但它不起作用。有人可以告诉我我做错了什么。
class UpdaterThread extends AsyncTask<Void, String, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
URL url = new URL(
"http://www.google.com/ig/api?weather=Cardiff");
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
WeatherHandler myWeatherHandler = new WeatherHandler();
xr.setContentHandler(myWeatherHandler);
xr.parse(new InputSource(url.openStream()));
}
catch (Exception e) {
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
SetWeather mySetWeather = new SetWeather();
temp.setText(mySetWeather.getTemp());
wind.setText(mySetWeather.getWind());
humidity.setText(mySetWeather.getHumidity());
}
}
我还在主类中使用.execute()方法来运行它。
答案 0 :(得分:0)
两个以1的价格:android AsyncTask xml parsing的AsyncTask问题为您提供了使用AsyncTask进行XML解析的一些上下文。
答案 1 :(得分:0)
首先:
SetWeather mySetWeather = new SetWeather();
temp.setText(mySetWeather.getTemp());
在哪里将解析后的信息添加到上面创建的新对象中?
什么是临时?在哪里定义?
其次,我个人更喜欢回复发送新对象的活动,然后在活动中更改UI,但这是个人偏好。
答案 2 :(得分:0)
我立即注意到有两件事可能是错的,或者不是你的意图:
doInBackground()
获取的值,以便在onPostExecute()
中使用,但是您将返回null,然后将其作为结果传入。这是你想要的吗?null
,因此将第二种类型设置为String
现在可以正常工作,但如果您返回一个新值,则需要更新此类型。第二种类型应该是Void
,因为这是未使用类型的约定(因为你没有实现onProgressUpdate()
)。有关您希望实现的内容以及示例代码的更多背景信息也有助于解决问题。
答案 3 :(得分:0)
是否可以在顺利完成进度的同时更新两个UI?因此,除非添加thread.sleep(),否则它在下载速度和UI通知处理程序方面的表现极差,除非添加了一个thread.sleep();