WorkManager:ResolvableFuture 只能从同一库组前缀中调用

WorkManager: ResolvableFuture can only be called from within the same library group prefix

一段时间以来,我在 ListenableWorker class 中使用了以下内容:

public ListenableFuture<Result> startWork() {
    ResolvableFuture<Result> resolvableFuture = ResolvableFuture.create();
    startSomeAsyncStuff(resolvableFuture);
    return resolvableFuture;
}

基本上,我开始一些异步工作,将 resolvableFuture 传递给该函数。异步工作完成后,我对从我的 ListenableWorker 传递的 resolvableFuture 对象调用以下命令:

resolvableFuture.set(Result.success());

这很有效,而且看起来仍然有效,但我现在看到针对 ResolvableFuture.create() 的以下 lint 错误消息:

ResolvableFuture can only be called from within the same library group prefix

它仍然可以编译,但是这个警告让我很困扰。现在正确的做法是什么?

您根本不应该使用 ResolvableFuture,更不用说 WorkManager 使用的内部版本了。

相反,您应该使用 AndroidX Concurrent library:

androidx.concurrent:concurrent-futures:1.0.0 provides CallbackToFutureAdapter class, a minimalistic utility that allows to wrap callback based code and return instances of ListenableFuture

您会在 1.0.0-beta01 release notes 中注意到,即使是 AndroidX 并发库也已从其 public API.

中删除了 ResolveableFuture

Javadoc for CallbackToFutureAdapter 有一个完整的示例:

public ListenableFuture<Result> startWork() {
    return CallbackToFutureAdapter.getFuture(completer -> {
         // Your method can call set() or setException() on the
         // Completer to signal completion
         startSomeAsyncStuff(completer);

         // This value is used only for debug purposes: it will be used 
         // in toString() of returned future or error cases.
         return "startSomeAsyncStuff";
    });
}

因此您将在 startSomeAsyncStuff 方法中使用 CallbackToFutureAdapter.Completer 代替 ResolvableFuture