Задержка отображения узла в JavaFx под управлением Android

У меня есть класс Dialog с методом wait для отображения собственного диалога прогресса:

public static void wait(String title){
    isOpen = true;
    ProgressIndicator progress = new ProgressIndicator(-1);

    Label label = new Label(title);
    label.getStyleClass().add("login-label");

    HBox container = new HBox();
    container.setStyle("-fx-background-color: white;");
    container.setAlignment(Pos.CENTER);
    container.getChildren().addAll(progress,label);
    if(Main.HEIGHT < 700){
        container.setSpacing(10);
        container.setPadding(new Insets(10,15,10,15));
    }else if(Main.HEIGHT < 1200){
        container.setSpacing(15);
        container.setPadding(new Insets(15,20,15,20));
    }else{
        container.setSpacing(20);
        container.setPadding(new Insets(20,30,20,30));
    }

    show("", container);
}

У меня есть этот фрагмент кода в одном из моих классов для отображения моего Диалога прогресса:

Platform.runLater(new Runnable(){
    @Override
    public void run() {
        Dialog.wait("Processing, please wait...");
    }
});

Но, к сожалению, есть задержка в его показе, я также пытался обернуть его внутри потока, но это тоже не сработало, я попытался запустить его в >Настольный компьютер, и он отлично работает, но почему не на моем устройстве Android?

Вот полный код:

download = new Button("Download");
download.getStyleClass().add("terminal-button");
download.setPrefWidth(Main.HEIGHT > 700 ? 180 : 140);
download.setOnAction(new EventHandler<ActionEvent>(){
    @Override
    public void handle(ActionEvent event) {

        Platform.runLater(new Runnable(){
            @Override
            public void run() {
                Dialog.wait("Processing, please wait...");
            }
        });

        Platform.runLater(new Runnable(){
            @Override
            public void run() {
                //GET THE SELECTED AREAS FOR DOWNLOAD
                List<String> selectedSectors = new ArrayList();
                String sectorid = null;
                for(Sector r : listView.getItems()){
                    if(r.isSelected()){
                        selectedSectors.add(r.getObjid());
                        sectorid = r.getObjid();
                    }
                }

                if(selectedSectors.size() > 1){
                    Dialog.hide();
                    Dialog.showAlert("Multiple downloads are not supported!");
                    return;
                }

                MobileDownloadService mobileSvc = new MobileDownloadService(); 
                //INIT DOWNLOAD
                Map params = new HashMap();
                params.put("assigneeid", SystemPlatformFactory.getPlatform().getSystem().getUserID());
                params.put("sectorid", sectorid);
                batchid = mobileSvc.initForDownload(params);

                int recordcount = -1;
                while (true) {
                    int stat = mobileSvc.getBatchStatus(batchid); 
                    if ( stat < 0 ) {
                        try {  
                            Thread.sleep(2000); 
                        }catch(Throwable t){;} 
                    } else {
                        recordcount = stat; 
                        break; 
                    }
                }

                if ( recordcount <= 0 ) {
                    Dialog.hide();
                    Dialog.showError("No data to download");
                    return;
                }

                downloadsize = recordcount;
                accountList = new ArrayList();
                int start=0, limit=50;
                while ( start < recordcount ) {
                    params = new HashMap();
                    params.put("batchid", batchid);
                    params.put("_start", start);
                    params.put("_limit", limit); 
                    List<Map> list = mobileSvc.download(params);
                    //if ( list != null ) accountList.addAll( list ); 
                    System.out.println("fetch results is " + list.size());
                    //new Thread( new ProcessDownloadResultTask(start,list)).start(); 
                    start += limit;                             
                }

                Dialog.hide();

                //SAVE AREA, STUBOUTS
                clearSector();
                for(Sector r : listView.getItems()){
                    if(r.isSelected()){
                        saveSector(r);
                    }
                }

                label.setVisible(true);
                progressbar.setVisible(true);
                progressbar.progressProperty().bind(task.progressProperty());
                new Thread(task).start();
                download.setText("Cancel");
                download.setDisable(false);
                download.setOnAction(new EventHandler<ActionEvent>(){
                    @Override
                    public void handle(ActionEvent event) {
                        continueDownload = false;
                        label.setVisible(false);
                        progressbar.setVisible(false);
                        download.setText("Back");
                        download.setOnAction(new EventHandler<ActionEvent>(){
                            @Override
                            public void handle(ActionEvent event) {
                                Main.ROOT.setCenter(new Home().getLayout());
                            }
                        });
                        root.setOnKeyReleased(new EventHandler<KeyEvent>(){
                            @Override
                            public void handle(KeyEvent event) {
                                if(event.getCode() == KeyCode.ESCAPE){
                                    if(Dialog.isOpen){ Dialog.hide(); return; }
                                    Main.ROOT.setCenter(new Home().getLayout());
                                }
                            }
                        });
                        Map params = new HashMap();
                        params.put("batchid", batchid);
                        params.put("downloadedlist", downloadedList);
                        MobileDownloadService svc = new MobileDownloadService();
                        svc.cancelDownload(params);
                    }
                });
                download.setDisable(false);
                    }
        });
    }
});

Указанный сценарий возникает, когда вы нажимаете кнопку, вывод должен быть таким: Диалоговое окно появится НЕМЕДЛЕННО, как только вы нажмете кнопку, но, к сожалению, диалоговое окно будет отображаться после завершения всего процесса кнопки! Я попытался обернуть его в Thread, но безуспешно!

Помогите мне, пожалуйста! Есть идеи?


person Ethyl Casin    schedule 23.04.2016    source источник
comment
Откуда простирается ваш класс Dialog? Из встроенных диалогов JavaFX? Из диалогов Глюона? Или это бесплатная реализация?   -  person José Pereda    schedule 23.04.2016
comment
Это мой собственный диалог, сэр.   -  person Ethyl Casin    schedule 25.04.2016
comment
Хорошо, что у вас все работает, хотя иногда нет необходимости изобретать велосипед :) Встроенный Dialog (как JavaFX, так и Gluon) легко настраивается.   -  person José Pereda    schedule 25.04.2016


Ответы (2)


Это короткий пример, показывающий, как вы можете использовать Dialog Gluon для обработки уведомлений о ходе выполнения фоновой задачи.

Он использует фиктивную задачу, но вы можете увидеть, как обрабатывать отображение и скрытие диалогового окна, а также использовать ProgressBar для уведомления о ходе выполнения и даже отмены задачи.

Используя подключаемый модуль Gluon для вашей IDE, создайте мобильный проект с одним представлением и измените представление следующим образом:

public class BasicView extends View {

    public BasicView(String name) {
        super(name);

        Dialog dialog = new Dialog("Download Progress");

        final ProgressBar progressBar = new ProgressBar();
        progressBar.setPrefWidth(200);

        final Label label = new Label("Process has ended");

        VBox vbox = new VBox(10, new Label("Download in progress..."), progressBar, label);
        vbox.setAlignment(Pos.CENTER);
        dialog.setContent(vbox);

        final Button cancel = new Button("Cancel");
        dialog.getButtons().add(cancel);

        dialog.setOnShown(e -> {
            cancel.setDisable(false);
            label.setVisible(false);

            final Task<Void> task = createDownloadTask();
            progressBar.progressProperty().bind(task.progressProperty());

            cancel.setOnAction(a -> task.cancel(true));

            task.setOnCancelled(c -> {
                PauseTransition pause = new PauseTransition(Duration.seconds(1));
                pause.setOnFinished(t -> dialog.hide());
                cancel.setDisable(true);
                label.setVisible(true);
                pause.play();
            });

            task.setOnSucceeded(s -> {
                PauseTransition pause = new PauseTransition(Duration.seconds(1));
                pause.setOnFinished(t -> dialog.hide());
                cancel.setDisable(true);
                label.setVisible(true);
                pause.play();
            });

            final Thread thread = new Thread(task);
            thread.setDaemon(true);
            thread.start();
        });

        Button button = new Button("Download");
        button.setGraphic(new Icon(MaterialDesignIcon.CLOUD_DOWNLOAD));
        button.setOnAction(e -> dialog.showAndWait());

        setCenter(new StackPane(button));
    }

    @Override
    protected void updateAppBar(AppBar appBar) {
        appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> System.out.println("Menu")));
        appBar.setTitleText("Downloads View");
    }

    private Task<Void> createDownloadTask() {
        return new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                for(int i = 0; i <= 10; i++) {
                    if (isCancelled()) {
                        break;
                    }
                    try {
                        Thread.sleep(1000);
                        updateProgress(i, 10);
                    } catch (InterruptedException ie) { 
                        if (isCancelled()) {
                            break;
                        }
                    }
                }
                return null;
            }
        };
    }
}

Диалоговое окно

Попробуйте заменить фиктивную задачу своей и посмотрите, что получится.

person José Pereda    schedule 23.04.2016

Я решил проблему, разделив его выполнение в одном из событий мыши, вместо того, чтобы собрать все вместе в setOnAction, я поместил код Dialog.wait("Processing, please wait..."); в setOnMousePressed, вот так:

download.setOnMousePressed(new EventHandler<MouseEvent>(){
    @Override
    public void handle(MouseEvent event) {
        if(!Dialog.isOpen) Dialog.wait("Processing, please wait...");
    }
});
download.setOnMouseReleased(new EventHandler<MouseEvent>(){
    @Override
    public void handle(MouseEvent event) {
        doDownload();
    }
});

Этот код работает!

person Ethyl Casin    schedule 25.04.2016