WorkManager:从 startWork() 正确退出而不做任何工作
WorkManager: exiting properly from startWork() without doing any work
当我的预定周期性工作请求运行时,可能是我不希望它在那个时候做任何工作,而只是等待周期性系列中的下一个。
目前我通过将 Completer
设置为成功状态并在触发异步工作之前返回来处理此问题,如下所示:
public ListenableFuture<Result> startWork() {
return CallbackToFutureAdapter.getFuture(completer -> {
if ( notThisTime() ) {
completer.set(Result.success());
return "nothing to do this time";
}
// the following will call completer.set(Result.success()) when it is finished...
startSomeAsyncStuff(completer);
return "started some async stuff";
});
}
这是应该做的吗?或者我应该 运行 notThisTime()
在 getFuture()
之前检查 并返回一个 ListenableFuture
设置为完成状态,或类似的东西?
是的,这才是正确的做法。
除非你引入所有 Guava,否则创建 ListenableFuture
对象的唯一方法是通过 CallbackToFutureAdapter.getFuture
,因此无论如何你都必须调用它才能访问 completer
并调用 set(Result.success())
.
startWork()
和 getFuture
lambda 运行 都在主线程上,所以在那里做阻塞工作同样不安全,所以你应该确保你的 notThisTime()
在任一位置的主线程上 运行 都是安全的。
当我的预定周期性工作请求运行时,可能是我不希望它在那个时候做任何工作,而只是等待周期性系列中的下一个。
目前我通过将 Completer
设置为成功状态并在触发异步工作之前返回来处理此问题,如下所示:
public ListenableFuture<Result> startWork() {
return CallbackToFutureAdapter.getFuture(completer -> {
if ( notThisTime() ) {
completer.set(Result.success());
return "nothing to do this time";
}
// the following will call completer.set(Result.success()) when it is finished...
startSomeAsyncStuff(completer);
return "started some async stuff";
});
}
这是应该做的吗?或者我应该 运行 notThisTime()
在 getFuture()
之前检查 并返回一个 ListenableFuture
设置为完成状态,或类似的东西?
是的,这才是正确的做法。
除非你引入所有 Guava,否则创建 ListenableFuture
对象的唯一方法是通过 CallbackToFutureAdapter.getFuture
,因此无论如何你都必须调用它才能访问 completer
并调用 set(Result.success())
.
startWork()
和 getFuture
lambda 运行 都在主线程上,所以在那里做阻塞工作同样不安全,所以你应该确保你的 notThisTime()
在任一位置的主线程上 运行 都是安全的。