2011-04-28 32 views
0

我有一个长时间运行的代码,用于解析XML并更新我的UI上的某些TextView,代码运行良好,但我需要将它放入AsyncTask中,我很新Android和我试图做到这一点,但它没有奏效。有人可以告诉我我做错了什么。使用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

你是说你试过这样的事情? UpdaterThread ut = new UpdaterThread(); ut.execute(null,null); – max4ever 2011-04-28 15:45:54

+0

是类似的东西,但没有null,null – Amanni 2011-04-28 15:58:43

+0

考虑:类UpdaterThread扩展AsyncTask JAL 2011-04-28 22:06:42

回答

0

有两件事情我立刻注意到,可能是错的或并非您的本意:

  1. 通常你会想返回onPostExecute()doInBackground()使用所获得的价值,但是你返回null,然后作为结果被传入。这是你想要的吗?
  2. 基于这个问题,您需要将AsyncTask类型更改为更适合的东西。由于您只是简单地返回null,现在将第二种类型设置为String就行,但是如果您返回新值,则需要更新此类型。无论如何,第二种类型可能应该是Void,因为这是未使用类型的约定(因为您没有实现onProgressUpdate())。

更多关于您希望与示例代码一起完成的背景知识也将有助于解决问题。

+0

让我试着更好地解释,我有一个处理程序类,它在xml文档上执行解析工作,我有另一个类来存储解析的xml中的值。从我的主要活动中,我可以调用setText和getvalues方法来检索值并在UI上显示它们。这一直是完美的工作。现在我需要把所有这些放到一个线程中,因为线程无法更新UI我正在使用AsyncTask。 – Amanni 2011-04-28 16:05:08

+0

我还需要让Aysnc返回任何值吗?这段代码启动解析器,它将文件传递给处理程序,处理程序检索值并将它们传递给另一个类。直接从存储它们的类中获取这些值是不可能的? – Amanni 2011-04-28 16:11:40

+0

如果以前有效,它应该在AsyncTask中以相同的方式工作。如果你在别处存储它们,AsyncTask不需要返回任何值。您的代码很混乱,因为您创建了一个新的SetWeather实例,然后立即尝试从中获取值。这些值是从SetWeather类外部抓取/存储的吗?或者那是一个错误? – Matt 2011-04-28 16:18:58

0

第一:

SetWeather mySetWeather = new SetWeather(); 
     temp.setText(mySetWeather.getTemp()); 

你在哪里解析信息添加到上面创建新的对象?

什么是温度?它在哪里定义?其次,我个人更喜欢回传发送新对象的活动,然后在活动中更改UI,但这是个人偏好。

+0

它们在主类中定义,我使用AsyncTask作为内部类。 temp是一个textView,SetWeather是另一个类,我有我的变量的getter和setter – Amanni 2011-04-28 15:53:39

+0

让我试着更好地解释,我有一个处理程序类,它在xml文档上执行解析工作,我有另一个类来存储解析的XML。从我的主要活动中,我可以调用setText和getvalues方法来检索值并在UI上显示它们。这一直是完美的工作。现在我需要把所有这些放到一个线程中,因为线程无法更新UI我正在使用AsyncTask。 – Amanni 2011-04-28 16:04:12

0

是否可以同时更新两个用户界面,同时获得进展顺利?在下载速度和UI通知处理程序不响应的情况下,除非添加thread.sleep();否则它会导致性能极差。