WorkManager:不做任何工作就从startWork()正确退出

问题描述 投票:0回答:1

当我安排好的定期工作请求运行时,可能我不希望它当时做任何工作,而只是等待定期系列中的下一个。

目前,我正在通过将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或类似内容?

android android-workmanager
1个回答
1
投票

是的,这是正确的处理方式。

[除非您拉入全部番石榴,否则创建ListenableFuture对象的唯一方法是通过CallbackToFutureAdapter.getFuture,因此,无论如何都必须调用它以获取对completer的访问权并调用set(Result.success())。] >

startWork()getFuture lambda都在主线程上运行,因此在该线程上进行阻塞工作同样不安全,因此您应确保notThisTime()在任一位置上都可以在主线程上安全运行。

© www.soinside.com 2019 - 2024. All rights reserved.