首页 > 解决方案 > Android WorkManager 10 分钟线程超时来自某处

问题描述

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

        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 文档中也没有看到对这样的超时的引用。如果有人可以向我指出有关此问题的解决方案或信息,请提前致谢!

标签: androidtimeoutandroid-workmanager

解决方案


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

JobScheduler确实,并WorkManager委托给JobSchedulerAndroid 5.0+ 设备。

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

不是直接的。

如果你将你的工作分成更小的块并使用 链接它们WorkManager,你可能能够完成所有的工作,尽管块之间可能会有延迟。


推荐阅读