Он не поддерживается "из коробки", но вы можете написать свою собственную версию withTimeoutOrNull
, которая будет поддерживать таймер с паузой. Основная идея состоит в том, чтобы запустить ваш блок в отдельной coroutineScope { ... }
и launch
вторичной вспомогательной сопрограмме, которая отменяет эту область после истечения времени ожидания. Теперь, если вы сохраняете ссылку на этого помощника cancellationJob
, вы можете отменить его, когда вам нужно приостановить свое время, и перезапустить его, когда вам нужно возобновить таймер.
Это дало бы вам по существу то же поведение, что и базовый withTimeout
, но с добавленной паузой. Для реализации варианта withTimeoutOrNull
требуется немного дополнительного кода. Вам нужно будет отловить исключение отмены и заменить его нулевым результатом.
В этой сущности можно найти отработанную реализацию: https://gist.github.com/elizarov/c5b0fde43ca14efbb8bcab13ad43c6ca