android - 避免从 WorkManager 复制 PeriodicWorkRequest
问题描述
在应用程序启动时,我想启动将永远工作的服务,但是当用户再次打开应用程序时,它会重复。
PeriodicWorkRequest.Builder sendDataBuilder = new PeriodicWorkRequest.Builder(SendConnectionMetricsWorker.class, Constants.REPEAT_TIME_INTERVAL_IN_HOURS, Constants.REPEAT_TIME_INTERVAL_UNITS)
.setConstraints(new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build());
PeriodicWorkRequest periodicWorkRequest = sendDataBuilder
.build();
WorkManager.getInstance().enqueue(periodicWorkRequest);
解决方案
您可以使用enqueueUniquePeriodicWork
而不是enqueue
. 根据文档:
此方法允许您将唯一命名的 PeriodicWorkRequest 排入队列,其中一次只能激活一个特定名称的 PeriodicWorkRequest。例如,您可能只希望一个同步操作处于活动状态。如果有一个待处理,您可以选择让它运行或用您的新工作替换它。uniqueWorkName 唯一标识此 PeriodicWorkRequest。
您可以按如下方式实现:
PeriodicWorkRequest.Builder sendDataBuilder = new PeriodicWorkRequest.Builder(SendConnectionMetricsWorker.class, Constants.REPEAT_TIME_INTERVAL_IN_HOURS, Constants.REPEAT_TIME_INTERVAL_UNITS)
.setConstraints(new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build());
PeriodicWorkRequest periodicWorkRequest = sendDataBuilder
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork("Send Data", ExistingPeriodicWorkPolicy.KEEP,periodicWorkRequest);
笔记:
ExistingPeriodicWorkPolicy.REPLACE
确保如果有标记为 uniqueWorkName 的待处理工作,它将被取消并运行新工作。ExistingPeriodicWorkPolicy.KEEP
仅当没有标有 uniqueWorkName 的待处理工作时,才会运行新的 PeriodicWorkRequest。
推荐阅读
- qt - qmake:无法打开配置文件
- python - 如何使用 pipenv 从 github 安装包
- extjs - 如何计算全局变量?
- java - FileLock 以防止删除文件但我无法打开它
- database - 通过 SQL Explorer 中的 Splunk DB Connect 的 Oracle 数据库 - “目录”显示为灰色
- c++ - 使用 std::bind 理解编译器错误
- c++ - 如何实现变参虚成员函数
- algorithm - 找到图的节点之间至少有 2 条路径
- r - 将制表符分隔的数据解析为 R data.table/data.frame 时如何排除某些行?
- variables - Terraform 将 2 个变量组合成一个新变量