我正在制作一个Android工作室应用程序,并试图让我的屏幕循环数字0-9,直到用户点击并停止特定数字的循环。我到目前为止编写的代码是:
public void loop () {
for (int a = 0; a<10; a = ++a % 10) {
textView2.setText("" + a);
}
相关的xml部分
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:id="@+id/textView2"
.../>
此代码不会在屏幕上输出任何内容。我尝试了一些不同的代码变体,如果它显示一个数字,它只显示最后一个数字'9'。这让我觉得它已经奏效了,但是它过快地通过数字来查看和停止最后一个而不是无限循环。有人能够指出我可能出错的地方吗?我仍在为相对简单的查询道歉。
当我确实让它工作,并且我想让它可点击时,我是否将onclicklistener放在for循环中?
非常感谢。
答案 0 :(得分:1)
你是对的,当它显示9时,它只是很快地通过数字循环,你甚至看不到它们的变化。
你没有做错任何事,你只需要在更改数字之间暂停。非常简单和难看的修复方法是在wait(1000)
方法之后添加setText(...)
。
但是,不建议这样做,因为Android在主线程上绘制和接收事件。当您使用wait
阻止线程1000毫秒时,您使线程无法接受该秒的任何事件,这会使您的应用冻结。
要修复冻结,您需要更新TextView
,然后在主线程上发布一条消息,它应该在1秒钟后再次更新。由于分离,它实际上看起来不像一个循环。
为了在主线程上发布消息,我将使用Handler
(android.os.Handler
),它在创建它的线程上执行消息,除非您使用不同的Looper
。< / p>
这是一个粗略的例子:
private int a = 0;
private Handler handler = new Handler();
private TextView textView2;
public void loop() {
handler.post(new Runnable() {
@Override
public void run() {
updateText();
a = a++ % 10;
if (a < 10) {
handler.postDelayed(this, 1000);
}
}
});
}
public void updateText() {
textView2.setText("" + a);
}
点击按钮时,只需致电loop()
,其余部分将自动处理。