WorkManager workstatus не видит поставленную в очередь работу по тегу - PullRequest
0 голосов
/ 20 сентября 2018

Я использую workManager для планирования фоновой периодической работы, работа запланирована, и я вижу из журнала, что работа выполняется периодически.Тем не менее, когда я запрашиваю статус работы, чтобы увидеть, поставлена ​​ли она в очередь, она всегда не возвращает ничего.Любая мысль?

        Log.e(logTag, "Scheduling a new User Sync Request");
        PeriodicWorkRequest userSyncRequest = new PeriodicWorkRequest
                .Builder(userPeriodicSync.class, 900, TimeUnit.SECONDS)
                .setConstraints(constraints)
                .addTag(context.getString(R.string.user_sync_request_job_tag))
                .build();
        workManager.enqueue(userSyncRequest);

        Log.i(logTag, "can i find the scheduled job now???");
        WorkManagerHelperFunctions.isWorkScheduled(context.getString(R.string.user_sync_request_job_tag));

вот функция, которую я получил онлайн, чтобы проверить статус работы

public static boolean isWorkScheduled(String tag) {
    Log.e(logTag, "WorkManagerHelperFunctions.isWorkScheduled is called to check tag " + tag);
    WorkManager instance = WorkManager.getInstance();
    if (instance == null) {
        Log.e(logTag, "workmageer instance is null, returning false");
        return false;
    }
    LiveData<List<WorkStatus>> statuses = instance.getStatusesByTag(tag);
    if (statuses.getValue() == null) {
        Log.e(logTag, "status value for tag " + tag + " is null , returning false");
        return false;
    }
    boolean running = false;
    for (WorkStatus workStatus : statuses.getValue()) {
        Log.d(logTag, "work id: " + workStatus.getId() + " with tag " + workStatus.getTags() + " is in state " + workStatus.getState());
        running = workStatus.getState() == State.RUNNING | workStatus.getState() == State.ENQUEUED;
    }
    return running;
}

Вот журнал:

09-19 23:46: 50.127 Контроллер 17331-17331: планирование нового запроса синхронизации пользователя

09-19 23: 46: 50.128 Контроллер 17331-17331: могу ли я найти запланированное задание сейчас ???

09-19 23: 46: 50.128 17331-17331 Periodic.WorkManagerHelperFunctions: WorkManagerHelperFunctions.isWorkScheduled вызывается для проверки тега userSyncRequestTag

09-19 23: 46: 50.128 17331-17331 тег WorkGanagerHelper возвращает функцию WorkManagerHelper для значения тегаложь

1 Ответ

0 голосов
/ 20 сентября 2018

LiveData не заполняет свое значение сразу - оно асинхронно.Вот почему getValue() возвращает значение NULL сразу же после получения LiveData.Вы должны присоединить Observer к вашему LiveData и дождаться обратного вызова:

LiveData<List<WorkStatus>> statuses = instance.getStatusesByTag(tag);
statuses.observe(activity, // Or a Fragment
    new Observer<List<WorkStatus>>() {
      @Override
      public void onChanged(@Nullable final List<WorkStatus> workStatuses) {
        // Here is where you can check for status on your work
      }
   });

Если вы работаете в фоновом потоке, вы можете использовать синхронные версии, доступные из synchronous ():

SynchronousWorkManager syncInstance = instance.synchronous();
List<WorkStatus> statuses = syncInstance.getStatusesByTagSync(tag);

Но в отличие от подхода LiveData, вы не будете продолжать получать обратные вызовы при изменении состояния - это даст вам только один момент времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...