обновление пользовательского интерфейса из обработчика в другом Runnable - PullRequest
1 голос
/ 29 июля 2011

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

У меня есть TextView и ImageView в моем макете. У меня есть AnimationDrawable в этом ImageView. Я переопределил класс AnimationDrawable, потому что я хочу знать, когда моя анимация будет завершена. Тем не менее, исполняемый файл, который я хочу вызвать, когда моя анимация закончится, работает правильно. Но в случае, когда я хочу обновлять TextView каждую секунду, другой исполняемый файл (в коде ниже) вызывает только один раз (я вижу число «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);                                          
        }
    });     
}

1 Ответ

0 голосов
/ 29 июля 2011

Вы не можете вызвать метод пользовательского интерфейса из рабочего потока. Вместо этого вам нужно изменить код в 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); 
    }
};

В разделе Worker Thread в руководстве разработчика Android есть больше примеров.

...