我正在使用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 db中还原一堆表。如果数据库很大,则可能需要一段时间
在一个实例中,任务正在线程[pool-1-thread-1,5,main]上运行,而在我可以准确地说出的10分钟(600秒)的运行时间上,线程[pool-2 -thread-1,5,main]创建一个具有空原因的CancellationException。如果我使用调试器阻止该线程异常结束,那么第一个线程就可以顺利完成。如果我让第二个线程由于其CancellationException而失败,那么它将尝试再次使长时间运行的任务入队,因此我必须在第一个线程仍在处理时防止第二次运行。
有人知道工人,工人使用的ThreadPoolExecutor或其他涉及的类是否具有10分钟的线程处理限制,如果有,可以更改它吗?我一直在研究文档和在创建CancellationException的AbstractFuture类中设置断点,以及所使用的ThreadPoolExecutor,无法看到在哪里设置或使用了此超时。仍在寻找:-)
我已经简要查看了WorkManager的未解决问题,但没有看到此超时。还没有在任何WorkManager文档中看到对超时的引用。如果有人可以给我指出解决方案或有关此的信息,请提前致谢!
答案 0 :(得分:1)
有人知道工人,工人使用的ThreadPoolExecutor或其他涉及的类是否具有10分钟的线程处理限制
JobScheduler
会这样做,并且WorkManager
会委托Android 5.0+设备上的JobScheduler
。
如果可以的话,有没有办法改变它?
不直接。
如果您将工作分解成较小的块,并使用WorkManager
将它们链接起来,则尽管这些块之间可能会有延迟,但您也许能够完成所有工作。