【问题标题】:Android WorkManager 10 minute thread timeout coming from somewhereAndroid WorkManager 10 分钟线程超时来自某处
【发布时间】:2019-05-13 00:50:49
【问题描述】:

我正在使用 android.arch.work:work-runtime:1.0.0-alpha12 运行一项且仅一项长时间运行的任务。在旧(慢)设备上,该过程可能需要长达 20 分钟。这是用来启动任务的代码sn-p:

        OneTimeWorkRequest databaseWork =
            new OneTimeWorkRequest.Builder(DatabaseWorker.class)
                    .build();
        WorkManager.getInstance().enqueue(databaseWork);

关于背景信息,databaseWork 正在检索一个加密的 zip 文件,对其进行解密,然后使用其中的内容来恢复 SqlCipher 数据库中的一堆表。如果数据库很大,这可能需要一段时间

在一个实例中,任务在线程 [pool-1-thread-1,5,main] 上运行,并且据我所知,在经过的时间正好 10 分钟(600 秒)处,线程 [pool-2 -thread-1,5,main] 创建一个带有 null 原因的 CancellationException。如果我使用调试器来阻止这个线程完成它的异常,那么第一个线程运行得很好,直到完成。如果我让第二个线程因 CancellationException 而失败,它会尝试再次将长时间运行的任务排入队列,因此我必须在第一个线程仍在处理时防止第二次运行。

有谁知道一个 Worker,或者它使用的 ThreadPoolExecutor,或者其他一些涉及的类是否有这个 10 分钟的线程处理限制,如果有,有没有办法改变它?我一直在查看文档并在创建 CancellationException 的 AbstractFuture 类中设置断点,以及使用的 ThreadPoolExecutor,但看不到设置或使用此超时的位置。仍在寻找:-)

我已经简要查看了 WorkManager 的未解决问题,但没有看到提到此超时。在任何 WorkManager 文档中也没有看到对这样的超时的引用。如果有人可以向我指出有关此问题的解决方案或信息,请提前致谢!

【问题讨论】:

  • this issue 涵盖了 10 分钟限制。
  • 谢谢!我打开这个问题120861600 是为了让 CancellationException 的原因在发生这种情况时有用(不是 null)。

标签: android timeout android-workmanager


【解决方案1】:

有谁知道一个 Worker,或者它使用的 ThreadPoolExecutor,或者其他一些涉及的类是否有这个 10 分钟的线程处理限制

JobScheduler 可以,WorkManager 在 Android 5.0+ 设备上代表JobScheduler

如果是这样,有没有办法改变它?

不直接。

如果您将工作分解成更小的块并使用WorkManager 将它们链接起来,您也许能够完成所有工作,尽管块之间可能存在延迟。

【讨论】:

  • 感谢 CommonsWare。您知道 JobScheduler 是否从电源管理限制中获得了 10 分钟的限制吗? link
  • @SKOlson:AFAIK,这个限制是 JobScheduler 所固有的。
  • 酷。我想我要添加一个问题,以便在超过此超时时将 CancellationException 原因设置为 null 以外的其他值。
猜你喜欢
  • 2023-03-27
  • 2013-06-15
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
相关资源
最近更新 更多