2011-02-07 9 views
2

私のテーブルレイアウトをasyncクラスから更新する際に問題があります。 私のasyncクラスはXMLデータをフェッチしているので、私はメインスレッドをブロックしません。私のログには、XMLデータが入ってきていることが示されていますが、データを使ってビューを更新する方法はわかりません。非同期スレッドからのメインスレッドテーブルレイアウトの更新

したがって、データを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

+0

@sisko喜んで助けてください!これまたは他の回答があなたを助けた場合は、回答の横にあるチェックボックスをクリックして、それらを正しい回答としてマークする必要があります。 –

関連する問題