Блокировка запуска Kotlin для синхронных устаревших вызовов

#java #android #multithreading #kotlin-coroutines #interrupted-exception

Вопрос:

Мне нужно совместить сопрограммный код с устаревшим Java-кодом в Android. В одном месте мне нужно вызвать метод suspend, который запрашивает что-то из базы данных Room из основного потока Android. И хотя это сильно игнорируется (я знаю, я знаю), я должен заставить этот вызов (по крайней мере, на данный момент) заблокировать основной поток.

Проблема в том, runBlocking { mySuspensionMethod() } что может вызвать InterruptedException , как указано в документах:

Если [заблокированный] поток [блокировки запуска] прерывается (см. Thread.interrupt ), то задание сопрограммы отменяется, и этот вызов блокировки запуска вызывает исключение InterruptedException.

Я InterruptedException снова и снова перечитываю обработку s, и ясно, что вам следует делать только одно из двух: создавать исключение дальше или устанавливать флаг прерывания для вашего собственного потока ( Thread.currentThread().interrupt() ).

Теперь я предполагаю, что обработка исключения — это тупик, поскольку я не хочу дальше генерировать исключение (что приведет к сбою приложения) и не хочу прерывать основной поток Android (что приводит к бог знает чему), поэтому вопрос в том, есть ли какой-либо другой APIчто я мог бы использовать, чтобы просто выполнить этот блокирующий вызов и вернуть результат?

Комментарии:

1. «я также не хочу прерывать основной поток Android» — это исключение подразумевает, что что-то еще прервало основной поток, поэтому либо прерывание происходит, и вам нужно его обработать, либо оно никогда не происходит, и вы можете его игнорировать

2. Я думаю, что нет ничего плохого в том, чтобы просто ничего не делать. Если кто-то прерывает основной поток, это означает, что он может возникать InterruptedException во многих разных местах вашего кода, а не только в runBlocking() . Потому что именно так обрабатываются прерывания — путем создания исключений, которые распространяются сверху вниз. Скорее всего, этот поток никогда не прерывается.