2011-02-07 35 views
2

我从我的异步类更新我的表格布局有问题。 我的异步类正在获取XML数据,所以我不阻止主线程。我的日志显示XML数据正在通过,但我不知道如何使用数据更新我的视图。从异步线程更新主线程tablelayout

所以我试图把数据放在tablerows中,并将行添加到TableLayout但日志显示错误,建议不允许Async类更新我的TableLayout视图。

我的代码如下:

public class RemotePrimary extends Activity { 

private static String SERVER_PATH = "http://test2.icerge.com/"; 
private static String XML_FILE1  = "samplexml"; 

//private static String SERVER_PATH = "http://tqs.mamlambo.com/"; 
//private static String XML_FILE1  = "scores.jsp"; 

private String[] data    = new String[10]; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    TableLayout datatable   = (TableLayout)findViewById(R.id.TableLayout_data); 

    Downloader downloader = new Downloader(); 
    downloader.execute(SERVER_PATH + XML_FILE1, datatable); 

} 

private class Downloader extends AsyncTask<Object, String, Boolean>{ 

    TableLayout table; 

    @Override 
    protected Boolean doInBackground(Object... params) { 
     // TODO Auto-generated method stub 
     String path    = (String)params[0]; 
     table     = (TableLayout)params[1]; 

     XmlPullParser xmldata = null; 
     try { 
      URL serverPath  = new URL(path); 
      xmldata    = XmlPullParserFactory.newInstance().newPullParser(); 
      xmldata.setInput(serverPath.openStream(), null); 
      addRecord(xmldata, table); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return true; 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     // TODO Auto-generated method stub 
     //super.onProgressUpdate(values); 
    } 

    private boolean addRecord(XmlPullParser data, TableLayout table){ 

     int eventType     = -1; 
     boolean bFoundScores   = false; 


     //find some records from xml 
     while(eventType != XmlResourceParser.END_DOCUMENT){ 
      if(eventType == XmlResourceParser.START_TAG){ 
       //get the name of the tag(eg scores or score) 
       String strName = data.getName(); 
       if(strName.equals("node")){ 
        bFoundScores   = true; 
        String scoreValue  = data.getAttributeValue(null, "Title"); 
        String scoreRank  = data.getAttributeValue(null, "Type"); 
        String scoreUserName = data.getAttributeValue(null, "Nid"); 
        Log.e("ADDING: ", scoreValue); 
        //Log.e("RETRIEVED", "collected : "+scoreValue+", "+scoreRank+", "+scoreUserName); 
        //publishProgress(scoreValue, scoreRank, scoreUserName); 

        TableRow newRow  = new TableRow(RemotePrimary.this); 
        TextView rowText = new TextView(RemotePrimary.this); 
        rowText.setText(scoreValue); 
        newRow.addView(rowText); 
        table.addView(newRow); 
       } 
      } 
      try { 
       eventType = data.next(); 
      } catch (XmlPullParserException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 



     return true; 
    } 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
    } 

}//close Downloader class 

} //关闭RemotePrimary类

这是一个有点多,但我知道我会得到任何帮助。

由于大量:-)

回答

3

你只能从UI线程上的用户界面的变化。 AsyncTask通过onPostExecute为您提供了一个简单的工具。正如它在docs中所述,onPostExecute始终在UI线程上执行。

doInBackground,做所有努力建立希望显示的结构化数据。返回该数据以便将其传递到onPostExecute,然后在那里添加适当的表格行。

+0

原谅缺少明显的新手:-)非常感谢。 – sisko 2011-02-08 09:39:19