我想通过http://www.android-graphview.org/为蓝牙线程中获取的数据绘制实时数据。
线程代码:
InputStream tmpIn = mSocket.getInputStream();
while (true) {
try {
BufferedReader r = new BufferedReader(new InputStreamReader(tmpIn));
String line;
while ((line = r.readLine()) != null) {
final String tmp = line;
runOnUiThread(new Runnable() {
@Override
public void run() {
addData(Integer.parseInt(tmp));
}
});
}
} catch (IOException e) {
Log.e("BT",
"BtConnectionThread run while loop: problem reading");
e.printStackTrace();
break;
}
}
}
活动代码:
public void addData(int data){
series.appendData(new DataPoint(lastx,data),true,winSize);
lastx++;
}
这很有效,但随着时间的推移变得非常迟钝。 BT线程接收100Hz的数据 - 在前几百个数据集之后,内存使用量是巨大的,并且图形开始滞后。是否有解决方法或替代的ringbuffer实现?
其他我想禁用x轴图例,但是找不到任何存档命令。
此致 卢卡斯
答案 0 :(得分:0)
首先,您可以通过强制转换以下方法来隐藏x轴的标签(假设您要这样做):
your_graph.getGridLabelRenderer().setHorizontalLabelsVisible( false );
至于滞后部分,我在具有大量积分的图表上也经历过它。如果您不需要可视化数据的整个历史记录,那么循环缓冲区的想法似乎很好。我会把它与
配对your_series.resetData( dataPoint[] my_data_points );
确保图表实时更新的方法。您的 addData 函数会将数据附加到循环缓冲区,您可以将其传递给上面的方法以及时更新图形。
我担心如果你想以高速率和大量积分刷新图形,这可能非常耗费资源,但至少你可以控制这两个参数。
答案 1 :(得分:0)
您可以重复使用数据点对象。 问题是你创建了新对象,当堆满了时,jvm必须gc它。
所以尝试以某种方式重用对象