WorkManager workstatus看不到按标签排队的工作

时间:2018-09-20 05:07:03

标签: android scheduled-tasks android-workmanager

我使用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 WorkManagerHelperFunctions:标记userSyncRequestTag的状态值为null,返回false

1 个答案:

答案 0 :(得分:1)

policies.js不会立即填充其值-它是异步的。这就是LiveData得到getValue()后立即返回null的原因。您必须将LiveData附加到Observer上并等待回调:

LiveData

如果您使用的是后台线程,则可以使用synchronous()中提供的同步版本:

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
      }
   });

但是与SynchronousWorkManager syncInstance = instance.synchronous(); List<WorkStatus> statuses = syncInstance.getStatusesByTagSync(tag); 方法不同的是,随着状态的变化,您将不会继续获得回调-它只会为您提供一个时间点值。