我使用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
答案 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);
方法不同的是,随着状态的变化,您将不会继续获得回调-它只会为您提供一个时间点值。