Android-график просмотра запаздывает на огромных данных

Я хотел построить данные в реальном времени через http://www.android-graphview.org/ для данных, полученных в потоке Bluetooth.

Код темы:

                    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 получает данные с частотой 100 Гц - после первых нескольких сотен наборов данных использование памяти становится огромным, и график начинает отставать. Есть ли обходной путь или альтернативная реализация кольцевого буфера?

Дополнительно я хотел отключить легенду оси X, но не смог найти никакой команды для архивирования.

С уважением, Лукас

2 ответа

Решение

Прежде всего, вы можете скрыть метки оси X (при условии, что это то, что вы хотите сделать), приведя следующий метод:

your_graph.getGridLabelRenderer().setHorizontalLabelsVisible( false );

Что касается медлительности, я испытал это и на графиках с большим набором точек. Идея кольцевого буфера кажется хорошей, если вам не нужно визуализировать всю историю ваших данных. Я бы связал это с

your_series.resetData( dataPoint[] my_data_points );

метод для обеспечения живого обновления графика. Ваша функция addData добавит данные в кольцевой буфер, который вы передадите вышеописанному методу для своевременного обновления графика.

Я боюсь, что это может быть довольно трудоемким, если вы хотите обновить график с высокой скоростью и с большим количеством точек, но вы, по крайней мере, сможете контролировать эти два параметра.

Вы можете повторно использовать объекты данных. Проблема в том, что вы создаете новые объекты, и когда куча заполнена, jvm должен ее собрать.

так что попробуйте использовать объекты каким-то образом

Другие вопросы по тегам