循环做一个有间隔的任务

Do a task with interval in a loop

我已经在这里看到了很多问题,但没有一个对我有用。我想每隔 1 秒在文本视图中设置文本。这是我试过的:

List<Integer> numbers = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = findViewById(R.id.ds);

        for (int i = 1; i < 90; i++) {
            numbers.add(i);
        }

        Collections.shuffle(numbers);

        for (int i = 0; i < numbers.size(); i++) {
            textView.setText(i + "");
        }




    }

这会立即执行任务,并且只会看到最后一个数字。那么这个:

    List<Integer> numbers = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = findViewById(R.id.ds);

        for (int i = 1; i < 90; i++) {
            numbers.add(i);
        }

        Collections.shuffle(numbers);

        for (int i = 0; i < numbers.size(); i++) {
            textView.setText(i + "");

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

在此屏幕显示空白,90 秒后,我看到最后一个数字。

那么,我该如何实现呢?

这些都不起作用。为了绘制,主线程必须return到框架中的Looper来处理绘制命令。换句话说,在 onCreate 存在之前它无法绘制。这意味着您的第一个版本只会绘制最后一次。第二个也只会绘制最后一次,但实际上可能会崩溃,因为您在主线程上花费的时间太长而没有完成(您永远不应该在主线程上休眠)。

解决方案是使用某种计时器机制并加以利用。这方面的示例是 TimerTask,或将消息发布到处理程序并在其中设置文本。