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。

所以尝试以某种方式重用这些对象