更新:我也发现了其他线程的问题;它们进入计划状态但从不转换为正在运行。为什么吗
我的程序有一个服务,它使用任务通过串口连接到设备。 换句话说,
public class ConnectService extends Service<String> {
protected Task createTask() {
return new ConnectTask();
}
class ConnectTask extends Task<ObservableList<String>> {
@Override
protected ObservableList<String> call() throws Exception {
...
connect();
...
}
}
}
如果以前的连接到设备的呼叫挂起,那么我想取消任务/线程,并在此尝试中重新开始。 为此,
if (connectService.getState() != Worker.State.READY) {
connectService.cancel();
}
connectService.restart();
但是在调试器中我发现如果状态是SCHEDULED,那么上面的代码将它发送到CANCELED。但是restart()不会将它发送到READY - 而是返回到SCHEDULED - 并且 call()不会被执行!
这似乎与文档here
相矛盾可重复使用的工作人员将从CANCELED,SUCCEEDED或FAILED过渡 回到现实。
我试过
if (connectService.getState() != Worker.State.READY) {
connectService.cancel();
connectService.reset();
}
connectService.start();
现在状态回到READY,但是call()永远不会被执行!
答案 0 :(得分:1)
您需要将Worker.State.SCHEDULED
添加到if
条件中排除的状态,即
if (connectService.getState() != Worker.State.READY &&
connectService.getState() != Worker.State.SCHEDULED) {
connectService.cancel();
}
connectService.restart();
这是因为Worker
始终会在READY
进入SCHEDULED
之前从RUNNING
过渡到Worker
。来自docs
然而,即使在立即执行
Worker
的情况下,也是如此 在进入之前,SCHEDULED
会暂时进入RUNNING
州READY
州。也就是说,转换总是从SCHEDULED
到。{RUNNING
到SCHEDULED
(当然除非工人被取消)。
如果由于某种原因您的工作陷入cancel
状态,则restart
和connectService
可能会将其恢复到相同的卡住状态。
另外,(没有看到你的其余代码,所以这只是推断)当你在假设它被挂起的情况下运行它时打断它的想法似乎不稳定,因为它可能运行良好但需要更长的时间预期,或者每次打电话都可能挂起。如果没有测试你可以在{{1}}内运行以确定它是否挂起,那么我猜你会遇到类似这样的事情,但感觉有问题。