【问题标题】:Updating a chart from an ArrayList over time?随着时间的推移从 ArrayList 更新图表?
【发布时间】:2016-04-06 21:03:57
【问题描述】:

我有一个 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。

最终结果是,在此示例代码中,图表每 100 毫秒用我的 ArrayList 中的下一个值更新。在此期间,我仍然可以放大/缩小图表并毫无问题地旋转它。

【问题讨论】:

  • 你能发布 addEntry() 代码吗?

标签: android mpandroidchart


【解决方案1】:

如果您的addEntry() 执行 UI 操作,那么让我解释一下您的问题 -

解释-

Android 是一个基于事件的系统。设备上发生了一些事情(屏幕被触摸、按键被按下等)并且 Android 引发了一个事件。应用程序被通知一个事件,当一个事件发生时它需要响应它,通常运行您编写的代码。您的应用程序在 Android 操作系统 (OS) 的控制下循环运行其代码。此代码循环称为 App 的执行线程。只有一个线程,它负责运行 App 代码和更新显示。

所以 UI 更新不会立即发生,并且每次循环运行时,您都会让 UI 线程休眠 100 毫秒。而当 Android 尝试更新 UI 时,您会使线程休眠,这意味着在此期间 UI 线程不会做任何事情。这会一直发生,直到您的循环完成。在你的循环结束后,最后的事件被执行,你会看到你的 UI 被 addEntry() 调用更新并传递了最新的值。

解决方案-

你可以使用postDelayed()-

new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                           //Perform your task and it will be executed after 100 ms
                        }
                    },100);

【讨论】:

  • 感谢推荐Handler和postDelayed方法!我最终使用它稍作修改,它工作。一开始,我把 addEntry 方法的内容放在 postDelayed 里面,然后像往常一样运行循环;这并不完全奏效,因为这只是意味着所有 addEntry 运行将立即运行,但无论我在 postDelayed 中给出的毫秒延迟。我最终使该方法在执行结束时递归调用下一个 addEntry。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
相关资源
最近更新 更多