WorkManager получает время следующей запланированной работы по тегу - PullRequest
0 голосов
/ 20 января 2019

Я использую WorkManager , чтобы запланировать как периодическую, так и разовую работу, и я помечаю все работы одним и тем же тегом, чтобы позже его можно было идентифицировать:

workRequestBuilder.addTag("mywork");

С различными рабочими элементами, поставленными в очередь, в разное время в будущем я хотел бы получить способ запроса рабочей очереди, чтобы определить, когда запланировано выполнение работы next для этого конкретного тега ("mywork" ). Да, я знаю, что он не будет точным и будет зависеть от Doze и т. Д., Но все равно было бы полезно знать, когда - в отсутствие других факторов - работа может начаться.

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

WorkManager workManager = WorkManager.getInstance();
ListenableFuture<List<WorkInfo>> workInfos = workManager.getWorkInfosByTag("mywork");

try {
    List<WorkInfo> workInfoList = workInfos.get();
    for (WorkInfo workInfo : workInfoList) {
        WorkInfo.State state = workInfo.getState();
        if (state == WorkInfo.State.ENQUEUED) {
            UUID workerId = workInfo.getId();
            Log.d(TAG, "found enqueued work with id " + workerId);
            // BUT HOW DO I TELL WHAT TIME THIS WORK IS SCHEDULED TO RUN?
        }
    }
} catch (ExecutionException e) {
    e.printStackTrace();
} catch (InterruptedException e) {
    e.printStackTrace();
}

1 Ответ

0 голосов
/ 11 июля 2019

Я нашел только 2 способа обойти это:

Предпосылки

Не используйте периодическую работу!Всегда планируйте следующую периодическую работу вручную с помощью OneTimeWorkRequest.

Обходной путь 1:

  • при создании WorkRequest вы будете вызывать setInitialDelay,После постановки запроса вы можете получить его идентификатор => сохранить этот идентификатор в базе данных со временем выполнения (и, возможно, с информацией о политике и всем, что вам нужно), затем вы всегда можете запросить базу данных и получить время следующего выполнения
  • при выполнении WorkRequest удалите его из базы данных и затем вручную запланируйте следующую «периодическую» задачу как OneTimeWorkRequest

Обходной путь 2:

  • добавьте 2 пользовательских тега, таких как "HasRunAt" и "RunAt: TIME_TO_RUN", ко всем вашим WorkRequests
  • , затем получите все WorkInfos как WorkManager.getInstance().getWorkInfosByTag("HasRunAt") и проверьте их теги и проанализируйтетот, который начинается с "RanAt:" ...

Заключение

Ни одно решение не является прекрасным, и я хотел бы также иметь возможность следующего:

  • получите время изучения, политику, ... от WorkInfo
  • получите InputData от WorkInfo - тогда вы можете поместить всю дополнительную информацию, которую выхочу получить доступ к этим данным и получить их оттуда ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...