• Для чего нужен внутренний класс?

    AlPsc
    @AlPsc
    Java/high load/big data
    В Java невозможно множественное наследование (речь в тексте именно о реализации, так что интерфейсы не в счёт), поэтому внешний класс может быть потомком только одного класса (назовём его A). Но если нужно повторно использовать поведение какого-то другого предка (назовём его B), то нужен, соответствено, и другой потомок – его роль и будет выполнять внутренний класс. А, будучи внутренним, он будет также иметь доступ ко всем членам внешнего класса, что и позволит в итоге использовать возможности и от A, и от B.
    Ответ написан
    2 комментария
  • Как правильно обновлять 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 комментарий
  • Куда разместить методы?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Следуйте принципу наименьшего удивления. Другими словами, найдите 3-4 программистов, которых Вы чье мнение цените и уважаете и спросите "Где бы ты искал в проекте класса описывающий приложение , но чье состояние читается из базы данных?". Если у 2 программеров мнение будет похожим, вероятно и Вы в будущем будете искать там же!
    А вообще оба метода, на мой взгляд, относятся к уровню представления данных, т.е. в паттерне MVC это часть "Модель". Мне кажется следует поступить так:
    * Эти два метода нужно расположить в одном классе. Но не в Возможные
    * Сообразить интерфейс с этими двумя методами, от него породить потомок , имеющийся DB . Это чтобы не привязывать к конкретному месту расположения, вдруг в след раз не DB будет, а Cloud или еще что-то.
    Ответ написан
    Комментировать