我有一个任务,可以查看Navison并返回一个ObservableList或Null
无论查找是否成功且列表是否填充,任务总是调用failed()而从不调用()!
任何想法为什么会发生这种情况?
这是我的任务:
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);
}
这是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;
}
提前致谢!!!
答案 0 :(得分:1)
您的代码不是线程安全的,您不应在任务调用方法中显示对话框和更新列表视图中的项目,而不将这些操作包装在Platform.runLater中。
有关详细信息,请搜索Platform.runLater和JavaFX并发的stackoverflow: