2

I have a task that does a Navison look up and returns an ObservableList or Null.
No matter if if the look up is successful and the list populates or not the task always calls the failed() and never the succeeded()!
Any ideas why this is happening?
Here is my task:

    public class LoadLocsTask extends Task<Void>{
    Button button;
    @Override protected Void call() throws Exception {

            ObservableList<String> list = application.getValidator().getLocList(button.getText());
            if(list != null){
                locationList.setItems(list);
            }else{
                Dialogs.showErrorDialog(application.getPrimaryStage(),"An error occured while retrieving the loaction list from navision.", "Please contact IS department", "Unable To Populate Location List");
                locationList.setItems(null);
            }
        return null;    
    }

    @Override protected void succeeded() {
        super.succeeded();
        selectProgressIndicator.setVisible(false);
        disableSelected(button);

    }
    @Override protected void failed() {
        super.failed();
        selectProgressIndicator.setVisible(false);
        disableSelected(button);

    }
    @Override protected void scheduled() {
        super.scheduled();
        locationList.getSelectionModel().clearSelection();
        locationList.setItems(null);
        selectProgressIndicator.setVisible(true);
        disableAll();

    }
    @Override protected void cancelled() {
        super.cancelled();
        logger.info("Cancelled");
        locationList.setItems(null);
        selectProgressIndicator.setVisible(true);

    }

Here is application.getValidator().getLocList(button.getText())

public ObservableList<String> getLocList(String selectedLoc) {
    ObservableList<String> binsOL = null;
    String warehouseCode = null;
    if (selectedLoc.equalsIgnoreCase("location1")) {
        warehouseCode = "LOCATION1";
    } else if (selectedLoc.equalsIgnoreCase("location2")) {
        warehouseCode = "LOCATION2";
    } else if (selectedLoc.equalsIgnoreCase("location3")) {
        warehouseCode = "LOCATION3";
    } else if (selectedLoc.equalsIgnoreCase("location4")) {
        warehouseCode = "LOCATION4";
    } else if (selectedLoc.equalsIgnoreCase("location5")) {
        warehouseCode = "LOCATION5";
    } 

    if (warehouseCode != null) {
        try {
            binsOL = FXCollections.observableArrayList();
            Bins[] bins = navWebservice.getBinsList(warehouseCode);
            for (Bins bin : bins) {
                binsOL.add(bin.getCode());
            }
        } catch (RemoteException e) {
            logger.error("LocationSelectionController - processLocButton(): Could not generate list for " + warehouseCode + " button", e);
            Dialogs.showErrorDialog(parentApp.getPrimaryStage(), e.getMessage(), "Please contact IS department", "Unable To Populate Location List");

        }
    }
    return binsOL;

}

Thanks in advance!!!

Brandon F.
  • 21
  • 4

2 Answers2

1

Your code is not threadsafe you should not being showing dialogs and updating items in list views in your task call method without wrapping those operations in Platform.runLater.

For more info, search stackoverflow for Platform.runLater and JavaFX concurrency:

Community
  • 1
  • 1
jewelsea
  • 150,031
  • 14
  • 366
  • 406
0

Inside the Call method just before the return statement call succeeded();

  • 1
    As it’s currently written, your answer is unclear. Please [edit] to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Nov 24 '21 at 02:24