android 海量数据的图表视图滞后
android graph view laggy on huge data
我想通过 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;
}
}
}
Activity代码:
public void addData(int data){
series.appendData(new DataPoint(lastx,data),true,winSize);
lastx++;
}
这工作得很好,但随着时间的推移会变得非常滞后。
BT 线程以 100Hz 的频率接收数据 - 在前几百个数据集之后,内存使用量非常大,图形开始滞后。是否有解决方法或替代环形缓冲区实现?
另外我想禁用 x 轴图例,但找不到任何命令来存档它。
此致,
卢卡斯
首先,您可以通过转换以下方法来隐藏 x 轴的标签(前提是您想要这样做):
your_graph.getGridLabelRenderer().setHorizontalLabelsVisible( false );
至于延迟部分,我在有大量点的图表上也有过经验。如果您不需要可视化数据的整个历史记录,循环缓冲区的想法似乎是一个不错的想法。我会将它与
配对
your_series.resetData( dataPoint[] my_data_points );
确保图表实时更新的方法。您的 addData 函数会将数据附加到循环缓冲区,您会将其传递给上述方法以及时更新图形。
如果你想以高速率和大量点刷新图形,我担心这会非常耗费资源,但你至少可以控制这两个参数。
您可以重复使用数据点对象。
问题是您创建了新对象,当堆已满时,jvm 必须对其进行 gc。
所以尝试以某种方式重用这些对象
我想通过 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;
}
}
}
Activity代码:
public void addData(int data){
series.appendData(new DataPoint(lastx,data),true,winSize);
lastx++;
}
这工作得很好,但随着时间的推移会变得非常滞后。 BT 线程以 100Hz 的频率接收数据 - 在前几百个数据集之后,内存使用量非常大,图形开始滞后。是否有解决方法或替代环形缓冲区实现?
另外我想禁用 x 轴图例,但找不到任何命令来存档它。
此致, 卢卡斯
首先,您可以通过转换以下方法来隐藏 x 轴的标签(前提是您想要这样做):
your_graph.getGridLabelRenderer().setHorizontalLabelsVisible( false );
至于延迟部分,我在有大量点的图表上也有过经验。如果您不需要可视化数据的整个历史记录,循环缓冲区的想法似乎是一个不错的想法。我会将它与
配对your_series.resetData( dataPoint[] my_data_points );
确保图表实时更新的方法。您的 addData 函数会将数据附加到循环缓冲区,您会将其传递给上述方法以及时更新图形。
如果你想以高速率和大量点刷新图形,我担心这会非常耗费资源,但你至少可以控制这两个参数。
您可以重复使用数据点对象。 问题是您创建了新对象,当堆已满时,jvm 必须对其进行 gc。
所以尝试以某种方式重用这些对象