我正在使用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
,那么这个系列可以正常绘制,但是其他两个系列为空,就像我上面描述的那样。
removeFirst
之后添加了它。我还尝试在每个条目后添加invalidate
,但问题仍然存在。 - Simondata.notifyDataChanged()
,然后在删除块后再次加上。无论在哪里添加,结果都是相同的。 - Simon