以下代码来自Head First Android。它用于秒表应用程序。
我在以下代码中有几个问题:
- 代码类似于 -> ongreate-> runtimer(((skips handler.post((( -> onstart-> onResume->返回handler.post((。
为什么首先跳过hander.post()
?
- 我有两个textView.setText((。但是第一个不起作用。这始终是最后一个。我放了第二个只是为了查看postdelay((方法之后代码的作用。
为什么第一个不起作用?我希望文本从" Hello"来回跳到" HH:MM:SS"。
- 因此,执行PostDelay((后的1秒延迟期间发生了什么。
代码是否开始正常运行,当其1秒钟时,postdelay((被称为?
-
为什么在后迪利(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
中写的代码将在一秒钟后执行。就这样。