Bra*_*ark 5 java task thread-safety javafx-8
我是Java中的新手.我的JavaFX应用程序有问题,我需要在数据库查询之前启动我的ProgressIndicator(类型为INDETERMINATE).这是我的代码的一部分:
spinner.setVisible(true);
passCripto = cripto.criptoPass(pass);
MyDao dao = new MyDaoImpl();
boolean isLoginOk = dao.isUserOk(user, passCripto);
boolean isStatusOk = dao.idStatusUser(user);
Run Code Online (Sandbox Code Playgroud)
完成后,我需要将微调器设置为FALSE,但只有在数据库查询完成时才会显示微调器.我怎么解决这个问题?
谢谢.
我这样做,但没有解决:
Task<Boolean> taskValidaLogin = new Task<Boolean>() {
@Override
protected Boolean call() throws Exception {
boolean validaLogin = ACDCDao.validaUsuario(usuario, senhaCripto);
return validaLogin;
}
};
Task<Boolean> taskValidaStatus = new Task<Boolean>() {
@Override
protected Boolean call() throws Exception {
boolean validaStatus = ACDCDao.validaStatusUsuario(usuario);
return validaStatus;
}
};
new Thread(taskValidaLogin).start();
new Thread(taskValidaStatus).start();
if (taskValidaLogin.getValue()) {
if (taskValidaStatus.getValue()) {
//do something
}
Run Code Online (Sandbox Code Playgroud)
ago*_*st_ 14
你必须将你的数据库东西放到另一个线程中,因为如果操作需要时间,它将冻结JavaFX线程(GUI)
在JavaFx中,您可以使用服务和任务来执行后台操作.你应该读
通过将数据库内容执行到服务中,您将能够轻松地监视它,因为Service提供了必要的操作,并且具有onSuccedeed,onFailed等方法...
真的看看,如果你想正确地做JavaFx,这是一个必不可少的部分.
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Run Code Online (Sandbox Code Playgroud)
import javafx.concurrent.Service;
import javafx.concurrent.Task;
public class ServiceExample extends Service<String> {
@Override
protected Task<String> createTask() {
return new Task<String>() {
@Override
protected String call() throws Exception {
//DO YOU HARD STUFF HERE
String res = "toto";
Thread.sleep(5000);
return res;
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
import javafx.concurrent.WorkerStateEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.ProgressIndicator;
public class Controller {
@FXML
private ProgressIndicator progressIndicator;
public void initialize() {
final ServiceExample serviceExample = new ServiceExample();
//Here you tell your progress indicator is visible only when the service is runing
progressIndicator.visibleProperty().bind(serviceExample.runningProperty());
serviceExample.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent workerStateEvent) {
String result = serviceExample.getValue(); //here you get the return value of your service
}
});
serviceExample.setOnFailed(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent workerStateEvent) {
//DO stuff on failed
}
});
serviceExample.restart(); //here you start your service
}
}
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.ProgressIndicator?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="200.0" prefWidth="200.0" xmlns:fx="http://javafx.com/fxml/1"
xmlns="http://javafx.com/javafx/2.2" fx:controller="Controller">
<ProgressIndicator fx:id="progressIndicator" layoutX="78.0" layoutY="55.0"/>
</AnchorPane>
Run Code Online (Sandbox Code Playgroud)
我很快就做了这个例子,但我觉得这就是你想要的.(我不会将我的progressIndicator添加到一个节点,仅用于示例)
之后spinner.setVisible(true);,通过将旋转器设置为不确定值(-1)来启动旋转器旋转. spinner.setProgress(-1d);
然后我想当任务完成时你想要它停止.有两个事件要使用,成功和失败.这意味着任务失败,而不是登录.这是一个成功的例子.
taskValidaStatus.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent event) {
spinner.setProgress(0d);
//and now you can check valida here after the task is finished
if (taskValidaLogin.getValue()) {
if (taskValidaStatus.getValue()) {
//do something
}
}
});
//now start the tasks after they're all set up.
new Thread(taskValidaLogin).start();
new Thread(taskValidaStatus).start();
Run Code Online (Sandbox Code Playgroud)
我没有测试这段代码,因为你没有提供一个有效的例子.
还有另一个问题,即validaLogin可能尚未完成.我只检查过一个线程是否完成.你应该做的是在其他线程onSucceeded事件中启动一个线程.我不确定你需要的顺序,但在taskLogin onSucceeded中可能看起来像这样.
if (taskValidaLogin.getValue()) {
new Thread(taskValidaStatus).start();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16062 次 |
| 最近记录: |