Android处理程序仅使用最后一个setText()更新TextView



以下代码来自Head First Android。它用于秒表应用程序。

我在以下代码中有几个问题:

  1. 代码类似于 -> ongreate-> runtimer(((skips handler.post((( -> onstart-> onResume->返回handler.post((。

为什么首先跳过hander.post()

  1. 我有两个textView.setText((。但是第一个不起作用。这始终是最后一个。我放了第二个只是为了查看postdelay((方法之后代码的作用。

为什么第一个不起作用?我希望文本从" Hello"来回跳到" HH:MM:SS"。

  1. 因此,执行PostDelay((后的1秒延迟期间发生了什么。

代码是否开始正常运行,当其1秒钟时,postdelay((被称为?

  1. 为什么在后迪利(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 
                }
            });
        }
    

为什么首先跳过hander.post()

它没有跳过,它将在onResume()返回后执行。所有Runnable s,通过与主线程关联的处理程序排队,仅在onResume()返回后才启动执行。

为什么第一个不起作用?

它确实有效。您只是无法视觉上看到它,因为两个方法呼叫textView.setText()同时被调用"几乎"。

以下呼叫顺序发生在每个run()

  • textView.setText(time)
  • 使用handler.postDelayed(this,1000)将相同的Runnable发布到队列。此后立即
  • textView.setText("hell0")称为

为什么第一个不起作用?我希望文本从" Hello"来回跳到" HH:MM:SS"。

您应该实现额外的逻辑,以在每个run()执行时在 time " hell0" 之间切换。

,例如。在活动中创建一个布尔标志,并根据标志值设置时间或" hell0"(不要忘记在每个run()执行时更改标志值(

为什么在postdelay(这是100(中使用。不是this.run()吗?

no, this.run()是同步执行(并立即执行(,并且是类型 void 。该代码不会像PostDelay((期望 runnable 类型那样编译,而不是 void

handler.postDelayed(this,1000);

这用于在1秒钟后运行您的功能。这是延迟1秒钟。

handler中写的代码将在一秒钟后执行。就这样。

最新更新