MPAndroidChartを使用して、加速度計データのリアルタイム プロットを作成しています。アプリを実行したままにしておくと、メモリ使用量が継続的に増加するように思われるため、チャートのスクロール ウィンドウから見えなくなった古いデータ ポイントを削除する方法を見つけようとしました。
問題は、保持/表示するポイントの最大数に設定した制限に達すると、ポイントは追加されなくなりますが、チャートはスクロールし続けることです。データのサイズは一定のままです (更新ごとに新しいポイントを追加し、古いポイントを削除しているため) が、チャートに新しいデータが表示されなくなりました。
私のフラグメントでは、次のようなチャートを作成していonCreateView
ます:
accChart = (LineChart) view.findViewById(R.id.accChart);
accChart.setOnChartValueSelectedListener(this);
LineData data = new LineData();
data.setValueTextColor(Color.WHITE);
accChart.setData(data);
次に、センサー マネージャーを使用して加速度計イベントをリッスンし、100 ミリ秒ごとにエントリを追加しonSensorChanged
ます。
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
。これらの行をすべてコメント解除すると、データがプロットされ続けます。シリーズの 1 つだけのコメントを外すremoveFirst
と、その 1 つが正常にプロットされますが、上記で説明したように他の 2 つが空です