Я хотел бы использовать сопрограммы Kotlin для вызова функций блокировки.
Например, я хотел бы иметь функцию приостановки, которая блокировалась бы до тех пор, пока пользователь не ответит на модальное диалоговое окно или пока не вернется сетевой вызов, когда диалоговое окно и сетевые библиотеки не предоставляют suspend функции.
Я реализовал это с помощью Mutex.
Например, для сценария блокировки сетевого вызова я сделал что-то вроде этого:
class Connection {
private val mutex = Mutex()
public suspend fun receive(): ByteArray {
mutex.lock()
val buf = ByteArray(42)
thread {
sock.getInputStream().read(buf, 0, 42) // blocking
mutex.unlock()
}
mutex.lock()
return buf
}
}
Оно работает.
Не обращайте внимания на проблемы, связанные с сетью, в приведенном выше коде (например, обработку ошибок, проверку количества фактически прочитанных байтов и т. Д.).
Также игнорируйте аспекты производительности при использовании потока (выделенный поток выше приведен только для примера).
С точки зрения использования Mutex для преобразования блокирующего потока в поток сопрограмм:
- Есть стандартный или лучший способ сделать это?
- Помимо сети или производительности - видите ли вы какие-либо недостатки в моем подходе?
runBlocking, которое блокирует поток до завершения операции? - person Vitaliy-T   schedule 11.10.2020IO. - person Vitaliy-T   schedule 11.10.2020