在折线图中,我会定期刷新图表中的数据。 这工作正常,并且符合预期。 当我使用的新数据集大于上一个数据集时,就会出现问题。然后,我得到了NullPointerException。
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'long java.lang.Long.longValue()'
这是我的方法:
LineData lineData = chart.getLineData();
if(lineData != null) {
ILineDataSet dataSet = lineData.getDataSetByLabel(label, false);
lineData.removeDataSet(dataSet);
}
int lineColor = colorDataLine;
int textColor = textColorDataLine;
Collections.sort(entries, new EntryXComparator());
LineDataSet dataSet = new LineDataSet(entries, label);
dataSet.setColor(lineColor);
dataSet.setValueTextColor(textColor);
lineData = new LineData(dataSet);
lineData.setDrawValues(false);
chart.setData(lineData);
在chart.setData(lineData);
上发生异常:
我从MPChartExample检查了DynamicalAddingActivity.java https://github.com/PhilJay/MPAndroidChart/archive/master.zip
使用addEntry通过迭代添加数据。
LineData data = chart.getData();
data.addEntry(new Entry(randomSet.getEntryCount(), value), randomDataSetIndex);
data.notifyDataChanged();
现在将我的第一种方法更改为以下方法时,仍然会发生错误。
lineData.addDataSet(dataSet);
lineData.setDrawValues(false);
chart.notifyDataSetChanged();
在将方法更改为这种迭代方式时:
LineData lineData = chart.getLineData();
if(lineData == null) {
lineData = new LineData();
chart.setData(lineData);
}
lineData.setDrawValues(false);
LineDataSet dataSet = (LineDataSet) lineData.getDataSetByLabel(label, false);
if(dataSet == null){
dataSet = new LineDataSet(entries, label);
lineData.addDataSet(dataSet);
}
while(dataSet.getEntryCount() > 0) {
dataSet.removeLast();
}
for (int i = 0; i < entries.size(); i++) {
lineData.addEntry(entries.get(i), 0); //edit2: set datasetIndex from i to 0 hardcoded
lineData.notifyDataChanged();
}
edit2:
它可以工作,但是由于两次迭代(删除所有旧的,添加所有新的),仍然看起来效率不高。
那么也许有更好的方法还是这是唯一的方法?
我也想知道两者之间会有什么区别
dataset.addEntry();
和
linedata.addEntry();
谢谢。
edit1:
它们被绘制了,但是大约一分钟后。使用null初始化时的等待时间非常长。
edit2: 请参见上方的删除线。