MPAndroidChart - 在实时图表中删除旧数据点

时间:2016-02-28 13:03:47

标签: java android plot mpandroidchart real-time-data

我正在使用MPAndroidChart创建一些加速度计数据的实时图表。看起来内存使用量会随着应用程序的运行时间的延长而持续增长,所以我试图找到一种方法,一旦它们超出了图表滚动窗口的视图就可以删除旧的数据点。

问题在于,一旦达到限制,我设置了要保持/显示的最大点数,不再添加点,但图表会继续滚动。我的数据大小保持不变(因为我应该添加新点并在每次更新时删除旧点),但不再在图表中显示新数据。

在我的片段中,我在onCreateView中创建了这样的图表:

accChart = (LineChart) view.findViewById(R.id.accChart);
        accChart.setOnChartValueSelectedListener(this);

        LineData data = new LineData();
        data.setValueTextColor(Color.WHITE);

        accChart.setData(data);

然后我使用传感器管理器监听加速度计事件,并在onSensorChanged中每100毫秒添加一个条目:

public void onSensorChanged(SensorEvent event) {
        sensor = event.sensor;

        curAccX = event.values[0];
        curAccY = event.values[1];
        curAccZ = event.values[2];

        long curTime = System.currentTimeMillis();
        long diffTime = (curTime - lastUpdate);

        // only allow one update every POLL_FREQUENCY.
        if(diffTime > POLL_FREQUENCY) {
            lastUpdate = curTime;

            addEntry(curAccX, curAccY, curAccZ);
        }

    }

然后在addEntry中添加条目我执行此操作:

private void addEntry(float curAccX, float curAccY, float curAccZ){
        LineData data = accChart.getData();

        if (data != null) {

            ILineDataSet xData = data.getDataSetByIndex(0);
            ILineDataSet yData = data.getDataSetByIndex(1);
            ILineDataSet zData = data.getDataSetByIndex(2);

            if (xData == null) {
                xData = createSetX();
                data.addDataSet(xData);
            }
            if (yData == null) {
                yData = createSetY();
                data.addDataSet(yData);
            }
            if (zData == null) {
                zData = createSetZ();
                data.addDataSet(zData);
            }

            // add a new x-value first
            data.addXValue(String.valueOf(System.currentTimeMillis()));

            data.addEntry(new Entry(curAccX, xData.getEntryCount()), 0);
            data.addEntry(new Entry(curAccY, yData.getEntryCount()), 1);
            data.addEntry(new Entry(curAccZ, zData.getEntryCount()), 2);

            //This is where I remove the first entry for each series
            if (xData.getEntryCount() > MAX_POINTS_DISPLAYED){
                xData.removeFirst();
                yData.removeFirst();
                zData.removeFirst();
            }

            // let the chart know it's data has changed
            accChart.notifyDataSetChanged();

            // limit the number of visible entries
            accChart.setVisibleXRangeMaximum(MAX_POINTS_DISPLAYED);

            // move to the latest entry
            accChart.moveViewToX(data.getXValCount());
        }
    }

我认为问题在于我使用removeFirst。如果我取消注释所有这些行,数据将不断绘制。如果我仅针对其中一个系列取消注释removeFirst,那么一个被绘制得很好,但另外两个是空的,如上所述

1 个答案:

答案 0 :(得分:0)

添加条目后,请尝试直接致电{{1}}。