Android GraphView не обновляется динамически

#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));

                }


            }
        });