Android更新UI主线程问题

时间:2011-07-25 15:49:11

标签: android multithreading textview

我无法弄清楚这是如何在android中完成的。这是一个非常简单的应用程序,TextView占据了屏幕的大部分,底部是ToggleButton。当手机上的按钮切换时,手机每5秒钟通过一个套接字请求新数据,然后必须将这些新数据预先添加到TextView的顶部。

因为您不想在主线程中执行5秒计时器或网络活动,所以我一直在使用asynctask,但主线程外部的线程无法更新TextView。

这是我正在做的一些伪代码。我怎样才能这样做,以便每次收到新数据时调用updateView,但是从主线程调用?

Communication(IO) Variables

TextView的字符串LinkedList

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

}

3 个答案:

答案 0 :(得分:3)

AsyncTask有一个名为OnProgressUpdate的函数。如果你想要它,并在这里添加代码,它将在UI线程上执行

要调用OnProgressUpdate函数,请调用PublishProgress。

答案 1 :(得分:2)

您需要覆盖

    protected void onProgressUpdate (Progress... values)
每次收到新数据时

publishProgress(Value...)

AsyncTask的doInBackground()方法不能在UI线程上运行,这就是它无法更新UI的原因。

另一种方法是使用Handler

答案 2 :(得分:2)

您可以在AsyncTask onPostExecute()onProgressUpdate()方法中执行此操作。从那里,您可以在UI上触发更新。我假设您在doInBackground()中获取数据。