Android - Как проверить, соответствует ли Worker ограничениям, когда он поставлен в очередь?

Как я могу проверить, соответствует ли Worker Constraints при постановке в очередь?

Например, если мне нужно загрузить данные из Интернета и установить, что Worker работает только при наличии подключения к Интернету. Как я могу проверить в этот момент, соответствуют ли Worker Constraints, чтобы предупредить пользователя?

Или, если я собираюсь выполнить задачу, которая может потреблять много энергии аккумулятора, и я хочу показать Dialog с надписью "Начните заряжать аккумулятор смартфона для начала"

Есть ли способ сделать это из WorkManager или мне нужно сделать это из внешнего метода?


person Oscar Méndez    schedule 07.06.2018    source источник
comment
Вы нашли какое-либо решение для этого? Я хочу добиться чего-то подобного. Но не в состоянии придумать приемлемое решение.   -  person Dory    schedule 04.02.2020


Ответы (4)


Я думаю, что в библиотеке должен быть какой-то обратный вызов, когда ограничения не выполняются (в настоящее время ничего подобного нет).

Я создал задачу Google здесь: https://issuetracker.google.com/issues/144367861

Не стесняйтесь пометить его звездочкой, чтобы он мог стать более заметным :)

person Alessandro Mautone    schedule 13.11.2019

ИСПОЛЬЗУЙТЕ getWorkInfoByIdLiveData().observe()

WorkManager.getInstance().enqueue(WorkRequest);

WorkManager.getInstance().getWorkInfoByIdLiveData(WorkRequest.getId())
    .observe(this, new Observer<WorkInfo>() {
        @Override
            public void onChanged(WorkInfo workInfo) {

                switch (workInfo.getState()) {
                    case ENQUEUED:
                        // TODO: Show alert here
                        break;
                    case RUNNING:
                        // TODO: Remove alert, if running 
                        break;
                    case SUCCEEDED:
                        // TODO: After work completed
                        break;
                    case FAILED:
                        break;
                    case BLOCKED:
                        break;
                    case CANCELLED:
                        break;
                }
            }
        });

WorkInfo.State имеет 6 состояний, ENQUEUED может быть полезен для ты.

person Hassan Naqvi    schedule 06.11.2020

Вам не нужно. Вы можете просто установить ограничения на OneTimeWorkRequest, и WorkManager запланирует Worker, когда ограничения будут соблюдены.

person Rahul    schedule 07.06.2018
comment
А что произойдет, если вы хотите сообщить пользователю об ограничениях, а не ждать, пока они будут выполнены? - person Oscar Méndez; 08.06.2018
comment
У вас есть LiveData, с помощью которого вы можете наблюдать за развитием WorkStatus. Так вы сможете показать прогресс. - person Rahul; 08.06.2018
comment
Я наблюдаю за прогрессом ... но наблюдение только сообщает мне состояния: заблокировано, отменено, поставлено в очередь, не удалось, выполняется или успешно. Возьмем пример сетевого подключения... рабочий поставлен в очередь, но обнаружена подключенная сеть... но как я могу сообщить пользователю Эй, у вас нет сетевого подключения... работа никогда не будет завершена - person Oscar Méndez; 08.06.2018
comment
Может быть много причин, по которым ваш Worker не работает. Кроме того, когда WorkManager использует JobScheduler, JobScheduler говорит WorkManager выполнять работу только при соблюдении ограничений. - person Rahul; 08.06.2018
comment
@OscarMéndez, ты наконец нашел решение? Я понял вашу точку зрения, и я хочу, чтобы что-то подобное работало. Решение может состоять в том, чтобы удалить ограничение и вручную обработать исключение, получив результат retry. Но тогда вы потеряете преимущества наличия ограничения, например, оно автоматически срабатывает при выполнении условий... :/ - person Alessandro Mautone; 13.11.2019
comment
@AlessandroMautone Любое возможное решение этого - person Dory; 04.02.2020

Это было бы так же просто, как удалить ограничение, в котором говорится, что для запуска задания требуется сетевое подключение.

Вы можете просто запланировать периодический запрос (вы можете следить за моим ответом на этом SO для реализации периодического запроса), и когда он срабатывает, проверьте, включено ли подключение к Интернету. Если это так, выполните задачу, в противном случае просто опубликуйте уведомление или любым другим подходящим способом, чтобы уведомить пользователя.

person Sagar    schedule 23.06.2018
comment
Да, это возможное решение, но я думаю, что библиотека должна предоставить способ узнать, когда ограничения не выполняются. Тогда вы все еще можете использовать ограничение и пользоваться всеми преимуществами, которые оно уже предоставляет, без реализации дополнительной логики. - person Alessandro Mautone; 13.11.2019