Обработчик /Runnable не работает с циклом

Я пытаюсь обновить 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 ответа

Решение

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

Используйте класс 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();
Другие вопросы по тегам