更新: 他のスレッドでも問題を見つけています。それらは Scheduled 状態に入りますが、Running に移行することはありません。なぜ?
私のプログラムには、タスクを使用してシリアル ポート経由でデバイスに接続するサービスがあります。言い換えると、
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 の場合、上記のコードはそれを CANCELLED に送信することがわかりました。しかし、restart() はそれを READY に送信しません - 代わりに SCHEDULED に戻ります - そしてcall() は実行されません!
これはここのドキュメントと矛盾しているようです
再利用可能なワーカーは、CANCELLED、SUCCEEDED、または FAILED から READY に戻ります。
私は試した
if (connectService.getState() != Worker.State.READY) {
connectService.cancel();
connectService.reset();
}
connectService.start();
状態は READY に戻りますが、call() は実行されません!