Как преобразовать обработчик Android в поток Kotlin - PullRequest
0 голосов
/ 17 июня 2020

У меня есть обработчик, который я использую для связи со службой. Я бы хотел вызвать из него функции приостановки, но это, очевидно, невозможно. Я бы не хотел запускать сопрограмму внутри функции 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() }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...