Проблема обновления основного интерфейса пользователя Android - PullRequest
0 голосов
/ 25 июля 2011

У меня проблемы с выяснением, как это делается в Android.Это очень простое приложение, TextView, занимающий большую часть экрана, и ToggleButton внизу.Когда кнопка переключается на телефон, общается через сокет каждые 5 секунд, запрашивая новые данные, эти новые данные должны быть добавлены в начало TextView.

Поскольку вы не хотите выполнять 5-секундные таймеры или сетевую активность в основном потоке, который я использовал asynctask, но потоки вне основного потока не могут обновить TextView.

Вот какой-то псевдокод того, что я делаю.Как сделать так, чтобы updateView вызывался при каждом получении новых данных, но из основного потока?

Communication(IO) Variables

LinkedList строк для 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

}

Ответы [ 3 ]

3 голосов
/ 25 июля 2011

AsyncTask имеет функцию OnProgressUpdate. Если вы переопределите его и добавите сюда код, он будет выполнен в потоке пользовательского интерфейса

Чтобы вызвать функцию OnProgressUpdate, вы вызываете PublishProgress.

2 голосов
/ 25 июля 2011

Вы можете сделать это внутри вашего AsyncTask в onPostExecute() или в onProgressUpdate() методе.Оттуда вы можете запускать обновления в пользовательском интерфейсе.Я предполагаю, что в doInBackground() вы получаете данные.

2 голосов
/ 25 июля 2011

При каждом получении новых данных вам необходимо переопределять

    protected void onProgressUpdate (Progress... values)

и publishProgress(Value...).

Метод AsyncTask doInBackground() не выполняется в потоке пользовательского интерфейса, и этоВот почему он не может обновить пользовательский интерфейс.

Другой метод будет использовать Обработчик .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...