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 должен ее собрать.
так что попробуйте использовать объекты каким-то образом