При миграции из FirebaseJobDispatcher в AndroidX Workmanager: как вернуть ListenableFuture в startWork?

На этот вопрос уже есть ответ здесь:

Всего 1 ответ


Вам нужно использовать ListenableWorker, если вам нужно выполнить асинхронный код. Есть страница документации Threading в ListenableWorker, которая покрывает это:

Если вы хотите выполнить некоторую работу на основе асинхронного обратного вызова, вы должны сделать что-то вроде этого:

public class CallbackWorker extends ListenableWorker {

    public CallbackWorker(Context context, WorkerParameters params) {
        super(context, params);
    }

    @NonNull
    @Override
    public ListenableFuture<Result> startWork() {
        return CallbackToFutureAdapter.getFuture(completer -> {
            Callback callback = new Callback() {
                int successes = 0;

                @Override
                public void onFailure(Call call, IOException e) {
                    completer.setException(e);
                }

                @Override
                public void onResponse(Call call, Response response) {
                    ++successes;
                    if (successes == 100) {
                        completer.set(Result.success());
                    }
                }
            };

            for (int i = 0; i < 100; ++i) {
                downloadAsynchronously("https://www.google.com", callback);
            }
            return callback;
        });
    }
}

Более простой альтернативой, если вы используете kotlin, является использование класса CoroutineWorker .
Если то, что вам нужно выполнить, является синхронным, использование класса Worker вероятно, проще и достаточно для вашего случая использования. Это задокументировано в Threading in Worker .


Есть идеи?

10000