#java #android #multithreading #android-graphview
Вопрос:
Я пытаюсь прочитать файл, в котором каждая строка содержит значения X и Y. Поэтому для каждой строки я хочу построить координаты. У меня есть кнопка, которая при нажатии должна измениться на кнопку «пауза», а когда файл будет прочитан и график полностью отображен, он должен снова переключиться на кнопку «воспроизведение». Для каждой координаты я использую функцию stepPlotter, которую я создал, после каждого графика координат X-Y я хочу отложить следующее построение.
По какой-то причине график строится только после чтения всего файла, а кнопка изображения меняется с «ВОСПРОИЗВЕСТИ» на «ПРИОСТАНОВИТЬ» только при чтении файла. На самом деле происходит то, что кнопка «воспроизвести» остается как «воспроизвести». Так как он внутренне изменяется на «паузу» (но визуально не изменяется), а затем возвращается к «воспроизведению», когда файл завершает чтение. Так что никаких визуальных изменений.
Мой код выглядит следующим образом:
В моем onCreate() у меня есть следующее:
//play/pause button
fabButton = findViewById(R.id.fab);
mLinearLayout = findViewById(R.id.linearLayoutGraph);
//setting up graph with origin
scatterPlot = new ScatterPlot("Position");
scatterPlot.addPoint(0, 0);
mLinearLayout.addView(scatterPlot.getGraphView(getApplicationContext()));
fabButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!isTracking) {
isTracking = true;
fabButton.setImageDrawable(ContextCompat.getDrawable(TrackingActivity.this, R.drawable.ic_pause_black_24dp));
readFile(fileToRead);
} else {
isTracking = false;
fabButton.setImageDrawable(ContextCompat.getDrawable(TrackingActivity.this, R.drawable.ic_play_arrow_black_24dp));
}
}
});
Функция чтения файла выглядит следующим образом:
private void readFile(File file){
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
//SKIPPING first three lines (these are not coordinate data)
br.readLine();
br.readLine();
br.readLine();
while ((line = br.readLine()) != null) {
String[] readings = line.split(";");
stepPlotter(readings);
Thread.sleep(50);
}
br.close();
isTracking =false;
} catch (InterruptedException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Наконец, функция построения графика является:
private void stepPlotter(String[] readings){
float rPointX = -Float.parseFloat(readings[8]);
float rPointY = Float.parseFloat(readings[9]);
scatterPlot.addPoint(rPointX, rPointY);
mLinearLayout.removeAllViews();
mLinearLayout.addView(scatterPlot.getGraphView(getApplicationContext()));
}
РЕДАКТИРОВАТЬ: Я использую achartengine для построения графика
Ответ №1:
Мне удалось заставить его работать, используя поток следующим образом:
fabButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!isTracking) {
isTracking = true;
new Thread(new Runnable() {
@Override
public void run() {
readFile(fileToRead);
}
}).start();
fabButton.setImageDrawable(ContextCompat.getDrawable(TrackingActivity.this, R.drawable.ic_pause_black_24dp));
} else {
isTracking = false;
fabButton.setImageDrawable(ContextCompat.getDrawable(TrackingActivity.this, R.drawable.ic_play_arrow_black_24dp));
}
}
});