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

drmrbrewer :

For some time in my ListenableWorker class I have used the following:

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

Basically, I start some asynchronous work, passing resolvableFuture into that function. When the async work is done, I call the following on that resolvableFuture object passed from my ListenableWorker:

resolvableFuture.set(Result.success());

This has worked well, and still appears to, but I'm now seeing the following lint error message against ResolvableFuture.create():

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

It still compiles, but this warning bothers me. What is the correct way to do this now?

ianhanniballake :

You shouldn't be using ResolvableFuture at all, much less the internal version used by WorkManager.

Instead, you should be using the 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

You'll note in the 1.0.0-beta01 release notes that even the AndroidX Concurrent Library has removed ResolveableFuture from its public API.

The Javadoc for CallbackToFutureAdapter has a full example of what this looks like:

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";
    });
}

So you'd use CallbackToFutureAdapter.Completer in place of a ResolvableFuture in your startSomeAsyncStuff method.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=174609&siteId=1