在android studio

时间:2015-05-13 16:25:41

标签: java android for-loop

我正在制作一个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循环中?

非常感谢。

1 个答案:

答案 0 :(得分:1)

你是对的,当它显示9时,它只是很快地通过数字循环,你甚至看不到它们的变化。

你没有做错任何事,你只需要在更改数字之间暂停。非常简单和难看的修复方法是在wait(1000)方法之后添加setText(...)

但是,不建议这样做,因为Android在主线程上绘制和接收事件。当您使用wait阻止线程1000毫秒时,您使线程无法接受该秒的任何事件,这会使您的应用冻结。

要修复冻结,您需要更新TextView,然后在主线程上发布一条消息,它应该在1秒钟后再次更新。由于分离,它实际上看起来不像一个循环。

为了在主线程上发布消息,我将使用Handlerandroid.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(),其余部分将自动处理。