SimpleFlowBus

60 阅读1分钟
open class FlowMessage(val data:Any?)
class NetworkChangeMessage(data: Any?) : FlowMessage(data)
object SimpleFlowBus {

    private const val TAG = "SimpleFlowBus"

    private val mMessageFlow = MutableStateFlow(FlowMessage("init"))

    private val mCoroutineScope = CoroutineScope(Dispatchers.Default + SupervisorJob())


    @JvmStatic
    fun sendMessage(message: FlowMessage) {
        mCoroutineScope.launch {
            mMessageFlow.value = message
        }
    }

    /**
     * 当前手管环境的coroutine版本不支持sharedFlow无法缓存订阅之前发的消息
     */
    @JvmStatic
    fun receiveMessage(
        dispatcher: CoroutineDispatcher = Dispatchers.Main,
        callback: (FlowMessage) -> Unit
    ): Job {
        return mCoroutineScope.launch {
            mMessageFlow.onEach {
                callback(it)
            }.flowOn(dispatcher).catch {
                Log.e(TAG, it.message)
            }.collect()
        }
    }

    @JvmStatic
    fun jobCancel(job: Job?) {
        try {
            job?.cancel()
            Log.d(TAG, "job cancel")
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}