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() 在任一位置的主线程上 运行 都是安全的。