WorkManager: ResolvableFuture может вызываться только из одного префикса группы библиотек - PullRequest
1 голос
/ 28 февраля 2020

Некоторое время в моем классе ListenableWorker я использовал следующее:

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

По сути, я начинаю некоторую асинхронную работу, передавая resolvableFuture в эту функцию. Когда работа asyn c завершена, я вызываю следующее для этого resolvableFuture объекта, переданного из моего ListenableWorker:

resolvableFuture.set(Result.success());

Это сработало хорошо, и все еще кажется, но я теперь видим следующее сообщение об ошибке lint против ResolvableFuture.create():

ResolvableFuture может быть вызван только из того же префикса группы библиотек

Он все еще компилируется, но это предупреждение беспокоит меня. Как правильно сделать это сейчас?

1 Ответ

1 голос
/ 28 февраля 2020

Вы вообще не должны использовать ResolvableFuture, тем более внутреннюю версию, используемую WorkManager.

Вместо этого вам следует использовать AndroidX Concurrent library :

androidx.concurrent:concurrent-futures:1.0.0 предоставляет класс CallbackToFutureAdapter, утилиту minimalisti c, которая позволяет переносить код на основе обратного вызова и возвращать экземпляры ListenableFuture

. 1.0.0-beta01 сообщает о выпуске , что даже параллельная библиотека AndroidX удалила ResolveableFuture из своего API c publi.

Javado c для 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";
    });
}

Таким образом, вы будете использовать CallbackToFutureAdapter.Completer вместо ResolvableFuture в вашем startSomeAsyncStuff методе.

...