Обработчик /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();