Android-如何检查工人排队时是否满足约束条件?
在排队时,如何检查Android-如何检查工人排队时是否满足约束条件?,android,android-workmanager,Android,Android Workmanager,在排队时,如何检查工作者是否满足约束 例如,如果我需要从internet下载数据并确定Worker仅在有internet连接时运行。此时如何检查工作人员是否满足约束条件,以提醒用户 或者,如果我要执行一项可能消耗大量电池电量的任务,我想显示一个对话框,上面写着“开始为智能手机电池充电以启动” 有没有一种方法可以从工作管理器中执行,或者我必须从外部方法执行?您不必这样做。您只需在OneTimeWorkRequest上设置约束,WorkManager将在满足约束时安排Worker 只需删除表示运行作
工作者
是否满足约束
例如,如果我需要从internet下载数据并确定Worker
仅在有internet连接时运行。此时如何检查工作人员是否满足约束条件
,以提醒用户
或者,如果我要执行一项可能消耗大量电池电量的任务,我想显示一个对话框,上面写着“开始为智能手机电池充电以启动”
有没有一种方法可以从工作管理器
中执行,或者我必须从外部方法执行?您不必这样做。您只需在OneTimeWorkRequest
上设置约束,WorkManager
将在满足约束时安排Worker
只需删除表示运行作业需要网络连接的约束即可
您可以简单地安排一个定期请求(您可以按照我的回答执行定期请求),当它被触发时,检查是否启用了internet连接。如果是这样,那么执行一个任务,否则只需发布通知或以任何其他合适的方式通知用户。我认为库应该提供某种回调,用于在不满足约束的情况下(目前没有类似的情况)
我在这里创建了一个谷歌问题:
您可以随意启动它,这样它就可以获得更多的可见性:)使用GetWorkInfo-ByIdLiveData().observe()
WorkManager.getInstance().enqueue(工作请求);
WorkManager.getInstance().GetWorkInfoByIdleData(WorkRequest.getId())
.观察(这个,新的观察者){
@凌驾
更改后的公共无效(WorkInfo WorkInfo){
开关(workInfo.getState()){
案件排队:
//TODO:在此处显示警报
打破
案件审理:
//TODO:删除警报(如果正在运行)
打破
案件成功:
//TODO:工作完成后
打破
案例失败:
打破
案件受阻:
打破
个案取消:
打破
}
}
});
有6种状态,排队对您很有用。如果您想通知用户约束条件,而不是等到约束条件满足后再通知用户,该怎么办?您有一个LiveData
,使用它可以观察WorkStatus
的进程。所以你可以展示进步。我正在观察进步。。。但是观察只让我知道状态:阻塞、取消、排队、失败、运行或成功。以网络连接为例。。。当检测到连接的网络时,工作进程已排队。。。但是我如何才能通知用户“嘿,你没有网络连接……wokr永远不会完成”你的工作者没有运行的原因可能有很多。另外,当WorkManager
使用JobScheduler
时,JobScheduler
只告诉WorkManager
在满足约束条件时执行工作。@OscarMéndez最终找到解决方案了吗?我明白你的意思,我正在寻找类似的工作。一个解决方案可能是删除约束并手动处理异常,提供一个重试
结果。但是你会失去约束的好处,比如当条件满足时,它会自动触发…:/诚然,这是一个可能的解决方案,但我认为库应该提供一种方法来知道何时不满足约束。然后,您仍然可以使用约束并获得它已经提供的所有好处,而无需实现额外的逻辑。您找到了解决方案吗?我想实现类似的目标。但无法提出可行的解决方案。
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;
}
}
});