Представление графика в 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, но не смог найти команду для ее архивирования.

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


person Lukasstr    schedule 13.04.2015    source источник


Ответы (2)


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

your_graph.getGridLabelRenderer().setHorizontalLabelsVisible( false );

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

your_series.resetData( dataPoint[] my_data_points );

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

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

person Cyril C.    schedule 14.04.2015

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

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

person appsthatmatter    schedule 17.04.2015