我有一个值的ArrayList,我想遍历ArrayList。对于每个新值,我想用该值更新图表,然后等待一段时间,然后再对下一个值执行相同操作。
目前,我的日志表示正在迭代所有值。但是,在我的测试设备上,图表直到最后才更新;此时,所有值都会立即加载,因此没有所需的"幻灯片放映"效果。
当我想开始播放ArrayList中的值时,会调用此方法:
public void playback(){
if(ret != null) {
for (int x = 0; x < ret.size(); x++) {
addEntry(ret.get(x));
try {
Thread.sleep(100);
} catch (Exception e){
//Do nothing
}
}
} else {
Log.d(LOG_TAG, "ret was null.");
}
}
我可以做些什么,以便在我的图表上一个接一个地显示这些值,每个值之间有一定的时间?
编辑:这是我在Shadab Ansari的帮助下最终实施的解决方案:
public void playback(){
if(ret != null) {
addEntry(0);
} else {
Log.d(LOG_TAG, "ret was null.");
}
}
private void addEntry(int index) {
final int in = index;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
yVals1.get(0).setVal(ret.get(in).intValue());
RadarDataSet set1 = new RadarDataSet(yVals1, "Set 1");
// And other UI stuff
// Recursive call!
if(in < ret.size() - 1){
addEntry(in + 1);
}
}
}, 100);
}
如果不清楚,ret是一个包含我要插入的数组的全局变量。 yVals1是填充雷达图表的条目的ArrayList。
最终结果是,在此示例代码中,图表使用ArrayList中的下一个值每100毫秒更新一次。在此期间,我仍然可以放大/缩小图表并旋转它,没有任何问题。
答案 0 :(得分:0)
如果您的addEntry()
执行了用户界面操作,请让我解释您的问题 -
说明 -
Android是一个基于事件的系统。设备上发生了某些事情(触摸屏幕,按下按键等),Android会引发一个事件。应用程序会收到一个事件的通知,当一个事件发生时,它需要响应它,通常运行您编写的代码。您的应用程序在Android操作系统(OS)的控制下循环运行其代码。此代码循环称为App的执行线程。只有一个线程,它负责运行App代码和更新显示。
因此,UI更新不会立即发生,并且每次循环运行时,UI线程都会休眠100毫秒。当Android尝试更新UI时,您使线程处于睡眠状态,这意味着在此时间段内UI线程将不会执行任何操作。直到你的循环完成才会发生这种情况。循环结束后,最终事件将被执行,您将通过调用addEntry()并使用最新值传递更新UI。
解决方案 -
您可以使用postDelayed()
-
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//Perform your task and it will be executed after 100 ms
}
},100);