随着时间的推移从ArrayList更新图表?

时间:2016-04-06 21:03:58

标签: android mpandroidchart

我有一个值的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毫秒更新一次。在此期间,我仍然可以放大/缩小图表并旋转它,没有任何问题。

1 个答案:

答案 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);