进行服务检查以查看它是否已在 JavaFx 中安排或 运行
Make a service check to see if it's already scheduled or running in JavaFx
我正在编写一个蓝牙消息传递程序作为 JavaFX 8 桌面应用程序的一部分。我正在使用来自 javafx.concurrent 的服务 class 来编写和读取消息,因此我的 UI 线程不会被工作淹没。我的代码如下:
public MessageHandler(String url){
this.url = url;
try {
StreamConnection streamConnection=(StreamConnection)Connector.open(url);
OutputStream outStream=streamConnection.openOutputStream();
outData = new DataOutputStream(outStream);
InputStream inStream=streamConnection.openInputStream();
inData = new DataInputStream(inStream);
writer = new Writer();
reader = new Reader();
} catch (IOException e){
e.printStackTrace();
}
}
public void write(String message){
writer.setMessage(message);
writer.start();
}
public String read(){
reader.start();
return reader.getValue();
}
class Reader extends Service<String>{
@Override
protected Task<String> createTask() {
return new Task<String>(){
@Override
protected String call() throws Exception {
return inData.readUTF();
}
};
}
}
class Writer extends Service<Void>{
String message;
public final void setMessage(String message){this.message = message;}
public final String getThisMessage(){
return this.message;
}
@Override
protected Task<Void> createTask() {
final String _message = getThisMessage();
return new Task<Void>(){
@Override
protected Void call() throws Exception {
outData.writeUTF(_message);
return null;
}
};
}
}
}
最初我计划让每次调用 read() 或 write() 形成一个新的服务实例,但决定不这样做,因为我不能同时进行多个读取或写入。这就是为什么我将 'reader' 和 'writer' 设为实例变量的原因。我的主要 class 中的代码如下所示。
MessageHandler mssgHandler = new MessageHandler(connectDevice.get());
mssgHandler.write("@");
mssgHandler.write("abfjsd");
System.out.println(mssgHandler.read());
mssgHandler.write("!");
当我 运行 我的程序使用此代码时,我得到:
java.lang.IllegalStateException: Can only start a Service in the READY state. Was in state SCHEDULED
这是有道理的。我需要一种方法让服务检查它是否已经安排好或 运行ning 在它 运行s 之前再次检查,并等待它尚未准备好。这也必须适用于两种服务,即 Reader 应该检查 Writer 是否在做某事,反之亦然。我知道存在 isRunning() 方法,但据我所知,它不会检查它是否已安排,这正是我现在遇到的问题。
感谢您的帮助!
已解决:
我添加了一个队列并更改了代码,因此它仅在前一个成功时才开始下一个 write/read。
您可以使用 getState()
on your Service
, which will return you the current state of the Worker
.
我正在编写一个蓝牙消息传递程序作为 JavaFX 8 桌面应用程序的一部分。我正在使用来自 javafx.concurrent 的服务 class 来编写和读取消息,因此我的 UI 线程不会被工作淹没。我的代码如下:
public MessageHandler(String url){
this.url = url;
try {
StreamConnection streamConnection=(StreamConnection)Connector.open(url);
OutputStream outStream=streamConnection.openOutputStream();
outData = new DataOutputStream(outStream);
InputStream inStream=streamConnection.openInputStream();
inData = new DataInputStream(inStream);
writer = new Writer();
reader = new Reader();
} catch (IOException e){
e.printStackTrace();
}
}
public void write(String message){
writer.setMessage(message);
writer.start();
}
public String read(){
reader.start();
return reader.getValue();
}
class Reader extends Service<String>{
@Override
protected Task<String> createTask() {
return new Task<String>(){
@Override
protected String call() throws Exception {
return inData.readUTF();
}
};
}
}
class Writer extends Service<Void>{
String message;
public final void setMessage(String message){this.message = message;}
public final String getThisMessage(){
return this.message;
}
@Override
protected Task<Void> createTask() {
final String _message = getThisMessage();
return new Task<Void>(){
@Override
protected Void call() throws Exception {
outData.writeUTF(_message);
return null;
}
};
}
}
}
最初我计划让每次调用 read() 或 write() 形成一个新的服务实例,但决定不这样做,因为我不能同时进行多个读取或写入。这就是为什么我将 'reader' 和 'writer' 设为实例变量的原因。我的主要 class 中的代码如下所示。
MessageHandler mssgHandler = new MessageHandler(connectDevice.get());
mssgHandler.write("@");
mssgHandler.write("abfjsd");
System.out.println(mssgHandler.read());
mssgHandler.write("!");
当我 运行 我的程序使用此代码时,我得到:
java.lang.IllegalStateException: Can only start a Service in the READY state. Was in state SCHEDULED
这是有道理的。我需要一种方法让服务检查它是否已经安排好或 运行ning 在它 运行s 之前再次检查,并等待它尚未准备好。这也必须适用于两种服务,即 Reader 应该检查 Writer 是否在做某事,反之亦然。我知道存在 isRunning() 方法,但据我所知,它不会检查它是否已安排,这正是我现在遇到的问题。
感谢您的帮助!
已解决:
我添加了一个队列并更改了代码,因此它仅在前一个成功时才开始下一个 write/read。
您可以使用 getState()
on your Service
, which will return you the current state of the Worker
.