我无法弄清楚这是如何在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
}
答案 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()
中获取数据。