Обработчик / Runnable не работает с циклом - PullRequest
0 голосов
/ 14 августа 2011

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

Код:

handler.post(new Runnable(){
           @Override
            public void run() {

            while(media[6].isPlaying()) {

            TextView myText = (TextView)findViewById(R.id.timerT);   

            myText.setText(getTimeString(media[1].getCurrentPosition()));        


            handler.postDelayed(this,10);
                                        }
        }

    });

Я думал, что runnable создает новый поток, а это значит, что этого не произойдет? Или я сильно ошибаюсь?

Ответы [ 2 ]

1 голос
/ 24 февраля 2016

Используйте CountDownTimer класс, как показано ниже:

// Function arguments are in milliseconds. 
CountDownTimer timer = new CountDownTimer(6000, 1000) {

    public void onTick(long millisUntilFinished) {
        //mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);

        // Do your stuff here.

        TextView myText = (TextView)findViewById(R.id.timerT);

        myText.setText(getTimeString(media[1].getCurrentPosition()));
    }

    public void onFinish() {
        mTextField.setText("done!");
    }
}

timer.start();
0 голосов
/ 14 августа 2011

Ваш черный экран вызван тем, что вы выполняете произвольную длительность цикла в потоке диспетчеризации событий: никогда не делайте этого. Для чего-то подобного вы хотите использовать AsyncTask или запустить Runnable в отдельном потоке, а затем использовать View.post только для отправки обновлений таймера.

...