У меня есть обработчик, который я использую для связи со службой. Я бы хотел вызвать из него функции приостановки, но это, очевидно, невозможно. Я бы не хотел запускать сопрограмму внутри функции handleMessage, потому что я бы хотел сохранить последовательную обработку сообщений. И я бы хотел, чтобы обработчик запускался в фоновом потоке (идеально подойдет пул потоков Dispatchers.Default). Переходя к архитектуре с использованием потоков, было бы идеально, если бы этот обработчик был холодным потоком. Как вы это делаете?
Handler - это что-то вроде:
private inner class IncomingHandler : Handler() {
override fun handleMessage(msg: Message) {
Log.d(TAG, "New Message [" + msg.what.toString(16) + "]")
when (msg.what) {
MsgConstants.MSG_ONE -> {
someOperationDrainingTheBattery(justAnInt)
suspendingAndMessingWithUserScreen()
sendingCommandsAround()
}
MsgConstants.MSG_TWO -> {
wastingSomeCpuTimeHere()
}
MsgConstants.MSG_THREE -> {
doAnOperationWhatever()
}
else -> super.handleMessage(msg)
}
}
Это используется как
var mMyCoolMessenger: Messenger = Messenger(IncomingHandler())
, и этот мессенджер передается для хранения в другом классе и используется как
replyMsgr.send(message)
, скажем, например, someOperationDrainingTheBattery использует StoragePermission, который отображается на StateFlow в случае when, или использует LoginCondition, сопоставленный с другим StateFlow в другом случае. Я видел несколько примеров, которые использовали combine
для создания Flow
из 2 источников, но как объединить один поток с одним из двух StateFlow на основе условия, которое исходит из первого потока?
fun someOperationDrainingTheBattery(condition: Int) {
when (condition) {
// this should not just check the value but if value is false wait
// and execute when the value becomes true
condition1 ->
if (myStateFlow1.value) { execThisAndEveryOneIsHappy() }
// same as the other
condition2 ->
if (myStateFlow2.value) { execThatAndEveryOneIsSad() }
}
}