2011-07-25 102 views
0

我無法弄清楚這是如何在android中完成的。這是一個非常簡單的應用程序,TextView佔據了屏幕的大部分,並在底部有一個ToggleButton。當手機上的按鈕每隔5秒鐘通過一個套接字請求新數據時,這個新數據就必須預置在TextView的頂部。Android更新UI主線程問題

因爲你不想做的5秒定時器或網絡活動中我一直在使用的AsyncTask,但線程主線程外無法更新TextView的主線程。

下面是一些僞代碼我在做什麼。我怎樣才能讓updateView在每次收到新數據時被調用,但是從主線程中調用呢?爲TextView的

public class MyActivity { 
//setContentView 
//setup network connection 
//getTextView 
//getToggleButton 
    //when clicked on start asynctask GetData 
    //when clicked off stop GetData (set global boolean to false) 
} 

public void updateView(){ 

//take linked list and make one String of proper size for textview 
//setTextView 

} 

private class GetData extends AsyncTask { 

//while we want to get data (global boolean variable) 
    //send request 
    //wait for response 
    //*update global text variable for the view* 
    //sleep for 5 seconds 

} 

回答

2

您可以在AsyncTaskonPostExecute()onProgressUpdate()方法中執行此操作。從那裏你可以在用戶界面上觸發更新。我假設您在doInBackground()中獲取數據。

2

的AsyncTask串

Communication(IO) Variables 

鏈表有一個稱爲OnProgressUpdate功能。如果你ovverride它,並在此處添加代碼,它將在UI線程

上執行要調用OnProgressUpdate功能,可以調用PublishProgress。

+0

謝謝你這樣做,如果我可以選擇多個正確的答案,我會的。感謝幫助。 – Michael

2

你需要重寫

protected void onProgressUpdate (Progress... values) 

publishProgress(Value...)每次接收新數據時。

中的AsyncTask的doInBackground()方法不會在UI線程上運行,這就是爲什麼它不能更新UI。

另一種方法是使用Handler

+0

謝謝,如果我可以選擇多個正確的答案,我會的。感謝幫助。 – Michael