android图表视图滞后于巨大的数据

时间:2015-04-13 13:54:39

标签: android graph android-graphview

我想通过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轴图例,但是找不到任何存档命令。

此致 卢卡斯

2 个答案:

答案 0 :(得分:0)

首先,您可以通过强制转换以下方法来隐藏x轴的标签(假设您要这样做):

your_graph.getGridLabelRenderer().setHorizontalLabelsVisible( false );

至于滞后部分,我在具有大量积分的图表上也经历过它。如果您不需要可视化数据的整个历史记录,那么循环缓冲区的想法似乎很好。我会把它与

配对
your_series.resetData( dataPoint[] my_data_points );

确保图表实时更新的方法。您的 addData 函数会将数据附加到循环缓冲区,您可以将其传递给上面的方法以及时更新图形。

我担心如果你想以高速率和大量积分刷新图形,这可能非常耗费资源,但至少你可以控制这两个参数。

答案 1 :(得分:0)

您可以重复使用数据点对象。 问题是你创建了新对象,当堆满了时,jvm必须gc它。

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