Android: изменение элемента XML в таймере - PullRequest
0 голосов
/ 04 декабря 2010

Я пытаюсь иметь счетчик (считать секунды и минуты) и обновлять его на дисплее каждую секунду.

У меня есть этот код в onCreate моего класса, который расширяет Activity:

timeOnCall = (TextView) findViewById(R.id.time);
minutes = seconds = 0;
timeOnCall.setText(minutes + ":" + seconds);

// Implements the timer
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    public void run() {
        ++seconds;
        if (seconds == 60) {
            seconds = 0;
            ++minutes;
        }
        // Display the new time
        timeOnCall.setText(minutes + ":" + seconds);
    }
}, 1000, 1000);

К сожалению, я получаю следующую ошибку:

android.view.ViewRoot$CalledFromWrongThreadException: Только исходный thread, создавший иерархию представлений, может касаться его представлений.

Я не уверен, как это исправить, поскольку он уже используется в методе onCreate(). Кто-нибудь знает решение?

Ответы [ 3 ]

0 голосов
/ 04 декабря 2010

Вы можете сделать это с помощью обработчика, что-то облегченное это:

final Handler mHandler = new Handler();
final Runnable updateText = new Runnable() {
    public void run() {
        timeOnCall.setText(minutes + ":" + seconds);
    }
};

в onCreate вы можете запустить:

onCreate(Bundle b) {
...
    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        public void run() {
            ++seconds;
            if (seconds == 60) {
                seconds = 0;
                ++minutes;
            }

            // Display the new time
        mHandler.post(updateText);
        }
    }, 1000, 1000);
}
0 голосов
/ 04 декабря 2010

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

http://developer.android.com/resources/articles/timed-ui-updates.html

0 голосов
/ 04 декабря 2010

Это потому, что вы пытаетесь изменить текстовое представление из другого потока.Вы не можете сделать это.Вам нужно отправить сообщение обратно в ветку, которой принадлежит текстовое представление.

public void run()

Это запускает новую ветку, отдельную от того, что запускает ваш пользовательский интерфейс.

Редактировать: Есть тонныпримеров в сети для кода, который вы ищете.Просто Google что-то вроде "обработчик сообщений темы Android".

...