Android Handler обновляет TextView только с последним setText () - PullRequest
1 голос
/ 29 июня 2019

Следующий код взят из Head First Android. Это для приложения секундомера.

У меня есть несколько вопросов в следующем коде:

  1. Код работает как -> OnCreate -> runTimer () (пропускает handler.post ()) -> OnStart -> onResume -> Возвращается к handler.post ().

Почему он вообще пропускает hander.post()?

  1. У меня есть два textView.setText (). Но первый не работает. Это всегда последний. Я поставил второй, чтобы посмотреть, что делает код после метода postDelay ().

Почему не работает первый? Я ожидаю, что текст переместится с «привет» на «чч: мм: сс».

  1. Итак, что именно происходит во время 1-секундной задержки после выполнения postdelay ().

Работает ли код нормально и когда через 1 секунду вызывается postDelay ()?

  1. почему это используется в postDealy (this, 100). не должно ли это быть this.run()?

    public class MainActivity extends AppCompatActivity {       
        private boolean running = false;
        private int counter = 0;
        private Handler handler = new Handler();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            runTimer();
        }
    
        public void onClickStart(View view){
            running = true;
        }
    
        public void runTimer(){
            final TextView textView = findViewById(R.id.timer);
    
            handler.post(new Runnable() {
    
                @Override
                public void run() {
                    int hours = counter/3600;
                    int minutes = (counter%3600)/60;
                    int secs = counter%60;
    
                    String time = String.format("%d:%02d:%02d", hours, minutes, secs);
                    textView.setText(time); // Doesn't set it to this - see last line 
    
                    if(running){
                        counter++;
                    }
                    handler.postDelayed(this,1000); // what does happens between next one second 
                    textView.setText("hell0"); // Always set it to this 
                }
    
            });
        }
    

Ответы [ 2 ]

1 голос
/ 29 июня 2019

Почему он пропускает hander.post() в первую очередь?

Он не пропускается, он будет выполнен после возврата onResume().Все Runnable s, поставленные в очередь через обработчик, связанный с основным потоком, начинают свое выполнение только после возврата onResume().

Почему не работает первый?

Это работает.Вы просто не можете видеть это визуально, потому что два вызова метода textView.setText() вызываются «почти» одновременно.

Следующая последовательность вызовов происходит в каждом run():

  • textView.setText(time),
  • то же самое Runnable отправляется в очередь с handler.postDelayed(this,1000).Сразу после этого
  • textView.setText("hell0") называется

Почему не работает первый?Я ожидаю, что текст будет переходить от «привет» к «чч: мм: сс».

Вы должны реализовать дополнительную логику для переключения между time и "hell0" при каждом выполнении run().

Например, создайте логический флаг в Activity и установите либо время, либо "hell0" в зависимости от значения флага (не забудьтеизменить значение флага при каждом выполнении run()) .

почему это используется в postDelay (this, 100).не должно ли это быть this.run()?

Нет, this.run() выполняется синхронно (и немедленно) и имеет тип void .Код не скомпилируется, так как postDelay () ожидает тип Runnable , а не void .

1 голос
/ 29 июня 2019

handler.postDelayed(this,1000);

Используется для запуска вашей функции через 1 секунду.Это задержка на 1 секунду.

Код, написанный на вашем handler, будет выполнен через секунду.Это все.

...