android - 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 文档中也没有看到对这样的超时的引用。如果有人可以向我指出有关此问题的解决方案或信息,请提前致谢!
解决方案
有谁知道一个 Worker,或者它使用的 ThreadPoolExecutor,或者其他一些涉及的类是否有这个 10 分钟的线程处理限制
JobScheduler
确实,并WorkManager
委托给JobScheduler
Android 5.0+ 设备。
如果是这样,有没有办法改变它?
不是直接的。
如果你将你的工作分成更小的块并使用 链接它们WorkManager
,你可能能够完成所有的工作,尽管块之间可能会有延迟。
推荐阅读
- json - Flask TypeError:Decimal 类型的对象不是 JSON 可序列化的
- javascript - 比较本地存储中的现有数据
- reactjs - 没有 YUP 的 Formik 验证,不查找错误
- javascript - 我的 JavaScript 代码不断收到未定义的消息
- c++ - inf=INT_MAX 的错误输出
- flutter - 如何知道特定项目是在哪个颤振版本上制作的?
- react-native - quickblox react-native-sdk
- android-studio - 如何在android studio中为android虚拟设备添加纬度和经度?
- odoo-14 - 如何在 odoo 14 中创建身份验证 rest api?
- firebase - 需要 Firebase 索引,但未提供链接