Запуск на UI Thread из вида - PullRequest
       36

Запуск на UI Thread из вида

1 голос
/ 02 августа 2011

У меня есть пользовательское представление, которое содержит несколько представлений само по себе. Я сделал так, чтобы при щелчке по одному из представлений внутри этого представления контейнера он запускал поток «таймера», который должен обновлять TextView, также внутри представления контейнера, каждую секунду. Моя проблема возникает, когда я хочу обновлять TextView каждую секунду. Видимо, это было не так просто, как я думал. Я реализовал Runnable в своем контейнере таким образом и выполнил поток при нажатии кнопки, чтобы запустить таймер:

public void run() {
        while(runnning) {
            // if one second has passed, update the Textview
        }
}

Я получаю типичное исключение невозможности касания-просмотра-внешней иерархии, которое в основном означает, что оно не выполняется в потоке пользовательского интерфейса. Я не хочу использовать post(Runnable) здесь, потому что я не хочу ждать до конца потока, чтобы обновить одну секунду. Для меня также не практично передавать всю активность, которую он сам себе должен выполнить runOnUiThread(Runnable). Так может кто-нибудь сказать мне, как я могу это сделать? Если кому-то нужны разъяснения, пожалуйста, дайте мне знать!

Ответы [ 2 ]

0 голосов
/ 02 августа 2011

Вы хотите использовать Android AsyncTask . Это специфическая для Android конструкция, предназначенная именно для этого типа периодического обновления графического интерфейса, ожидая, когда что-то завершится.

Сделайте свой таймер в doInBackground и вызывайте publishProgress всякий раз, когда вы хотите обновить GUI. Затем в onProgressUpdate просто обновите графический интерфейс. onProgressUpdate запускается в потоке графического интерфейса, а doInBackground автоматически запускается в фоновом потоке.

0 голосов
/ 02 августа 2011

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

...