WorkManager: корректный выход из startWork () без какой-либо работы - PullRequest
0 голосов
/ 29 февраля 2020

Когда мой запланированный рабочий запрос periodi c выполняется, может случиться так, что я не хочу, чтобы он выполнял какую-либо работу в это время, и просто жду следующего в серии periodi c.

В настоящее время я справляюсь с этим, устанавливая Completer в успешное состояние и возвращаясь перед тем, как запустить asyn c, например, так:

public ListenableFuture<Result> startWork() {
    return CallbackToFutureAdapter.getFuture(completer -> {
        if ( notThisTime() ) {
            completer.set(Result.success());
            return "nothing to do this time";
        }
        // the following will call completer.set(Result.success()) when it is finished...
        startSomeAsyncStuff(completer);
        return "started some async stuff";
    });
}

Это так и должно быть быть сделано? Или я должен выполнить проверку notThisTime() до getFuture() и вернуть ListenableFuture установленное значение, или что-то в этом роде?

1 Ответ

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

Да, это правильный способ ведения дел.

Если вы не используете всю гуаву, единственный способ создать объект ListenableFuture - через CallbackToFutureAdapter.getFuture, поэтому вам нужно вызвать что в любом случае, чтобы получить доступ к completer и вызвать set(Result.success()).

И startWork(), и лямбда getFuture работают в главном потоке, так что блокировать работу там также небезопасно, поэтому вы должны убедиться, что ваш notThisTime() безопасен для запуска в главном потоке в любом месте.

...