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

drm*_*wer 4 android android-workmanager

在我的ListenableWorker课堂上有一段时间我使用了以下内容:

public ListenableFuture<Result> startWork() {
    ResolvableFuture<Result> resolvableFuture = ResolvableFuture.create();
    startSomeAsyncStuff(resolvableFuture);
    return resolvableFuture;
}
Run Code Online (Sandbox Code Playgroud)

基本上,我开始一些异步工作,传入resolvableFuture该函数。异步工作完成后,我对该resolvableFuture对象调用以下内容ListenableWorker

resolvableFuture.set(Result.success());
Run Code Online (Sandbox Code Playgroud)

这运行良好,并且似乎仍然有效,但我现在看到以下 lint 错误消息ResolvableFuture.create()

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

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

ian*_*ake 6

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

相反,您应该使用AndroidX Concurrent 库

androidx.concurrent:concurrent-futures:1.0.0提供CallbackToFutureAdapter类,一个允许包装基于回调的代码并返回实例的简约实用程序ListenableFuture

您会在1.0.0-beta01 发行说明中注意到,即使是 AndroidX 并发库也已从ResolveableFuture其公共 API 中删除。

对的JavadocCallbackToFutureAdapter有这看起来像什么一个完整的例子:

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";
    });
}
Run Code Online (Sandbox Code Playgroud)

所以你会在你的方法中使用 aCallbackToFutureAdapter.Completer来代替。ResolvableFuturestartSomeAsyncStuff