循环做一个有间隔的任务
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,或将消息发布到处理程序并在其中设置文本。
我已经在这里看到了很多问题,但没有一个对我有用。我想每隔 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,或将消息发布到处理程序并在其中设置文本。