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