Ответы пользователя по тегу Java
  • Как правильно обновлять Progressbar из цикла?

    zorgrhrd
    @zorgrhrd Автор вопроса
    Прошу прощения, два дня бился головой о стену в попытке понять, почему оно не работает, оказывается искал не в том месте, дело в том что буфер сначала накапливался, а потом уже после того как поток закрылся, разом отдавал вывод в цикл и прогрессбар молниеносно набирал 100%. Т.е. с обновлением бара проблем нет, дело было в самом буфере, переписал метод:

    private void runCmdWithProgress(String... args) throws IOException {
            Process proc = Runtime.getRuntime().exec(args);
            InputStream inputStream = proc.getErrorStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String s = null;
    
            while ((s = bufferedReader.readLine()) != null) {
                    Double progress = Double.parseDouble(s.split("%")[0]) / 100;
                    Platform.runLater(() -> tab_adb_progressbar.setProgress(progress));
            }
            try {
                proc.waitFor();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


    Плюс к ответу Александра, да, данный метод из GUI потока нужно вызывать обязательно в отдельном, я делаю так же как у вас:
    new Thread(() -> {
    	                        try {
    	                            runCmdWithProgress(commands);
    	                            Platform.runLater(() ->  showDialogInformation(positive);
    	                        } catch (IOException e) {
    	                            e.printStackTrace();
    	                        }
    	                    }).start();


    Всем спасибо!
    Ответ написан
    1 комментарий