Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Обновление пользовательского интерфейса из обработчика в другом Runnable

Автор вопроса: woyaruОтветов: 1

У меня проблема с чем-то, что должно работать как таймер. Я прочитал эту статью в соответствии с использованием "таймера" в Android: http://developer.android.com/resources/articles/timed-ui-updates.html

У меня есть TextView и ImageView в моем макете. У меня есть AnimationDrawable в этом ImageView. Я переопределил класс AnimationDrawable, потому что хочу знать, когда моя анимация будет завершена. Однако runnable, который я хочу вызвать, когда моя анимация закончилась, работает правильно. Но в случае, когда я хочу обновлять TextView каждую секунду, другой runnable (в приведенном ниже коде) вызывается только один раз (я вижу число "1" во время всей анимации).

TextView timeFlow;
int seconds;

private Runnable mUpdateTimeTask = new Runnable() {
       public void run() {
           seconds++;
           timeFlow.setText(String.valueOf(seconds));
       }
};

private void startAnimation() {
    image = (ImageView) this.findViewById(R.id.image);
    recordImage.setBackgroundResource(R.drawable.record_animation);
    timeFlow = (TextView) this.findViewById(R.id.time_flow);
    timeFlow.setText("...");

    image.post(new Runnable() {
    @Override
    public void run() {
        CustomAnimationDrawable currentAnimation = new CustomAnimationDrawable((AnimationDrawable) recordImage.getBackground());
        currentAnimation.setOnFinishCallback(runnable);
        recordImage.setBackgroundDrawable(currentAnimation);
        currentAnimation.start();

        handler.removeCallbacks(mUpdateTimeTask);
        handler.postDelayed(mUpdateTimeTask, 100);
        }
    });
}

androidtimerhandler

Ответы

Ответ 1 · Jason

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

private Runnable mUpdateTimeTask = new Runnable() {
    public void run() {
         seconds++;
         timeFlow.post(new Runnable() {
               timeFlow.setText(String.valueOf(seconds));
         });
         // It's not clear if handler is accessible here, but you get the picture.
         handler.postDelayed(mUpdateTimeTask, 100);
    }
};

Раздел Рабочий поток в руководстве для разработчиков Android. имеет больше примеров.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы