我在使视图可见方面遇到了麻烦。如图所示:它们确实都出现了,但是是同时出现的,而我想在它们之间稍加延迟地展示它们。目前,我有以下代码,应该更加清楚:
public void performExperiment (View v) {
Log.i(TAG, "Experiment has started on view: " + v);
final ArrayList<FocusPoint> permutation = new ArrayList<>(Arrays.asList(focusPoints));
Collections.shuffle(permutation);
for (FocusPoint fp: permutation) {
try {
Thread.sleep(1000);
fp.setVisibility(ImageView.VISIBLE);
//fp.invalidate();
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, "Sleep failed");
}
}
}
FocusPoint类是Android中ImageView的扩展,并且在单击按钮时会调用该方法。
需要发生的是,所有视图以随机顺序显示在屏幕上,并且在它们之间有一秒钟。但是,此代码等待16秒(视图总数为16),然后立即显示所有视图。我试图使视图无效以重绘它,并且还尝试从try-catch块中取出“ fp.setVisibility(ImageView.VISIBLE)”,但两者均无效。(其中后者显然不起作用,我没想到它真的起作用,但我真的很绝望:P)我现在已经搜索了几个小时,而且都没有StackOverflow页和其他论坛/文档对此问题有一个答案。在循环继续到下一个循环之前,如何确保绘制焦点?
使用Thread.sleep(ms)
延迟UI线程是一个非常危险的想法,并且如您所见,它不会导致任何问题。通过将线程阻塞16秒钟,您可以有效地冻结该时间段内的应用程序-包括这段时间内可能发生的任何重绘和其他事件处理。永远不要那样做。
相反,请使用Handler
和及其postDelayed(Runnable, ms)
方法来计划将来的可见性更改。处理程序通过将消息添加到事件循环中来工作,因此它们不会破坏正常行为。
检查您的代码的此修改版本:
private static final long FP_SHOW_DELAY_MS = 1000;
private Handler handler = new Handler();
public void performExperiment (View v) {
Log.i(TAG, "Experiment has started on view: " + v);
final ArrayList<FocusPoint> permutation = new ArrayList<>(Arrays.asList(focusPoints));
Collections.shuffle(permutation);
for (int i = 0; i < permutation.size(); i++) {
final FocusPoint fp = permutation.get(i);
handler.postDelayed(new Runnable() {
@Override
public void run() {
fp.setVisibility(View.VISIBLE);
}
}, (i + 1) * FP_SHOW_DELAY_MS);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句