Я использую 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 секунд) по истечении времени Thread [pool-2-thread-1,5, main] создает исключение CancellationException с нулевой причиной.Если я использую отладчик, чтобы остановить этот поток от завершения с его исключением, то первый поток работает нормально до завершения.Если я позволю второму потоку завершиться с ошибкой с его CancellationException, он попытается снова поставить в очередь долгосрочную задачу, поэтому мне придется защищаться от второго запуска, пока первый поток все еще обрабатывает.
Кто-нибудь знает, еслиWorker, или ThreadPoolExecutor, который он использует, или какой-либо другой задействованный класс имеет этот 10-минутный предел обработки потоков, и если да, есть ли способ изменить его?Я смотрел на документ и устанавливал точки останова в классе AbstractFuture, который создает исключение CancellationException, а также используемый ThreadPoolExecutor и не может видеть, где этот тайм-аут устанавливается или используется.Тем не менее все еще смотрю: -)
Я кратко рассмотрел открытые проблемы для WorkManager и не упомянул об этом тайм-ауте.Также не видел ссылки на тайм-аут, как это ни в одном из документов WorkManager.Если кто-то может указать мне решение или информацию об этом, заранее спасибо!