【问题标题】:WorkManager: how is network constraint handled when AlarmManager is used?WorkManager:使用AlarmManager时如何处理网络约束?
【发布时间】:2018-12-19 04:54:56
【问题描述】:

对于 21 之前的 Android 版本,WorkManager 似乎在后台使用了 AlarmManager,因为 JobScheduler 不可用。参见例如here.

但是在使用 WorkManager 设置网络约束时,如下所示:

Constraints.Builder constraintsBuilder = new Constraints.Builder();
constraintsBuilder.setRequiredNetworkType(NetworkType.CONNECTED);
Constraints constraints = constraintsBuilder.build();

OneTimeWorkRequest.Builder workRequestBuilder = new OneTimeWorkRequest.Builder(MyWorker.class);
workRequestBuilder.setInitialDelay(5000, TimeUnit.MILLISECONDS);
workRequestBuilder.setConstraints(constraints);

使用 JobScheduler 的行为似乎是计划的作业将坐在那里,直到网络恢复,然后它会立即触发,因为现在满足了约束。

但是警报有点不同,自然没有相关的约束。那么当 Android CONNECTIVITY_CHANGE 来手动处理网络约束?

【问题讨论】:

  • 警报可以简单地检查互联网,如果没有找到,重新安排。
  • @GabeSechan 但重新安排时间?假设我从现在开始安排 6 个小时的工作(警报),并且在 6 个小时后警报触发(没有网络) WorkManager 可以做出什么明智的决定来重新安排警报?还有六个小时?任意 5 分钟、1 分钟还是什么?
  • 您将不得不深入研究操作系统代码才能弄清楚这一点,我希望它会随着时间的推移而改变,作为实现细节。但是我希望 JobScheduler 没有更好的工作——它们都是写在 AlarmManager 之上的层,它们不是真正的自下而上的替代品。
  • WorkManager 已经在监听CONNECTIVITY_CHANGE。您无需做任何其他事情。

标签: android android-jetpack android-workmanager


【解决方案1】:

WorkManager 已经监听CONNECTIVITY_CHANGE - 仅仅因为它使用警报并不意味着这是它使用的唯一信号。您无需手动执行任何操作; WorkManager 会为您完成所有的约束跟踪。

【讨论】:

  • 这就是我所期望的,尽管在实践中它似乎并没有像那样工作。根据对运行 4.3 的模拟器的一些观察,它似乎没有发生......即我可以看到当连接关闭但重新建立连接时计划触发工作(刷新小部件)这项工作似乎没有触发。我已经切换回我的旧代码以在我的 AppWidgetProvider 中观看 CONNECTIVITY_CHANGE (并且没有对工作设置网络约束)并且它的行为与我预期的一样......小部件刷新立即恢复网络。
  • 我的AppWidgetProvider 仍然注册为接收CONNECTIVITY_CHANGE,在尝试使用网络限制的WorkManager 时......这不会搞砸吗?在onReceive() 我确实打电话给super.onReceive() 并且WorkManager 本身应该仍然能够利用连接更改触发器来管理21 年前网络受限的工作吗?这似乎并没有发生在我身上。
  • 我会回去检查是否还有其他事情在起作用。您的回答确实让我放心,WorkManager 应该做我期望它做的事情......如果事实证明它提供了一个统一的接口来安排工作/工作这对所有 Android 版本都有效……这对我来说是圣杯……太棒了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多