【问题标题】:What does WorkManager do with jobs after hitting JobScheduler limit of 100?达到 JobScheduler 限制 100 后,WorkManager 对作业做了什么?
【发布时间】:2020-02-13 10:46:13
【问题描述】:

我已经在互联网上搜索了有关此主题的信息,但似乎没有人再遇到此问题了。

还记得这个有趣的错误吗?

java.lang.IllegalStateException:超过 JobScheduler 100 作业限制。我们在 JobScheduler 中统计了 101 个 WorkManager 工作;我们的数据库中有 50 个跟踪的工作;我们的配置限制是 50。

原因:java.lang.IllegalStateException:应用不能安排超过 100 个不同的作业

好吧,尽管我换了很多工作去做enqueueUniqueWork,但我的一些用户似乎仍在达到这个限制。 我的用例是为那些连接不佳且没有连接的人离线做很多事情,从而创建大量工作来更新远程服务器上的资源。我从来没有遇到过 FirebaseJobDispatcher 的这个问题(至少我没有意识到),有些人可能几天都没有信号,如果有人几周都无法连接会发生什么?它将轻松建立数百个工作岗位。因此,这个错误。

我的问题是当达到限制时这些工作会发生什么?它们只是被调度程序丢弃了吗?我现在在输入这个时会丢失人们的数据吗?

更新

Android 版本:在 7.0、8.0、8.1 上确认,可能更多

WorkManager 版本:2.3.0

【问题讨论】:

    标签: java android android-jetpack android-workmanager


    【解决方案1】:

    我们最近修复了一个错误,该错误导致 WorkManagers 跟踪 JobScheduler 中的作业与 jobs实际状态不匹配。这发生在非常罕见的情况下,我认为这就是你的情况。

    https://issuetracker.google.com/issues/149092520 是最近报告的错误。我在公共跟踪器上报告错误之前修复了它,因为谷歌的一个应用程序遇到了相同的边缘情况。

    此更改 (https://android-review.googlesource.com/c/platform/frameworks/support/+/1226859) 已修复。我们应该很快将其作为WorkManager 2.3.2 的一部分发布。

    如果您迫不及待,您可以使用与最终版本相同的快照构建。

    这是你需要的 gradle sn-p:

    repositories {
        google()
        maven { url 'https://ci.android.com/builds/submitted/6195753/androidx_snapshot/latest/repository/' }
    }
    
    dependencies {
      implementation "androidx.work:work-runtime:2.4.0-SNAPSHOT"
    }
    

    您可能需要做的另一件事是摆脱陈旧的工作。就像在初始化 WorkManager 之前调用 JobScheduler.cancelAllJobs() 一样简单。您可以在 Application 子类中的 Application.onCreate() 中执行此操作。

    如果您需要更多帮助,请随时联系错误跟踪器,我可以为您提供帮助。

    【讨论】:

    • 哇!我认为这肯定是我的错/缺乏知识!谢谢你,先生!似乎我一直在 WorkManager 中发现所有边缘情况和间歇性错误。你能告诉我在调度程序限制下工作请求会发生什么吗?
    • WorkRequests 仍由 WorkManager 跟踪。随着您在JobScheduler 中的工作完成,并且空位空闲,我们将用以前未安排的工作填补这些空位。您不会丢失任何数据。
    • Rahul 你刚刚度过了我的周末。不幸的是,尽管以确切的方式添加了存储库,但我无法访问快照构建。 Gradle 不知道我在寻找什么。
    • 能否请您告知是否有可以尝试的工作快照版本?
    【解决方案2】:

    从异常消息看来,您只有 20 个 WorkManager 跟踪的 WorkRequest。 该问题可能是由于 JobScheduler 的底层实现中的错误导致的,这有助于了解您在哪个设备/操作系统版本上看到这些错误。

    此外,每个应用程序的 100 个作业限制,并且不限于 WorkManager 的使用。如果在您的应用中(或在您包含的 SDK 中)直接使用 JobScheduler,这可能有助于达到 100 个作业的限制。

    最后,您能分享一下您使用的是哪个 WorkManager 版本吗?

    【讨论】:

    • 我更新了我的问题以包含这些内容。此外,我的应用程序不使用任何原始实现 JobScheduler。我已将所有异步工作转换为使用 WorkManager
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2011-10-18
    相关资源
    最近更新 更多