Android:坑-协程-订阅时序导致收不到流

坑-协程-订阅时序导致收不到流

封装了一个MVI框架,极低概率出现这样一种问题:

页面A、页面B,A跳转B,B再返回A,然后A立刻再跳入B,偶现ViewModelScope.launch{} 域中的ShareFlow没有触发。

代码:

kt 复制代码
abstract class BaseFlowViewModel<VS : ViewState, I : UserIntent,Changes: ReduceViewStateChange<VS>>(
    application: Application,
    firstViewState: VS
) : BaseViewModel(application) {

    private val _viewState: MutableStateFlow<VS> = MutableStateFlow(firstViewState)
    val viewState : MutableStateFlow<VS> = _viewState

    private val _intent:MutableSharedFlow<I> = MutableSharedFlow(extraBufferCapacity = 5, onBufferOverflow=BufferOverflow.DROP_OLDEST)

    protected abstract suspend fun realSendIntent(intent: I)

    protected abstract suspend fun catchError(throwable: Throwable)

    fun sendIntent(intent: I){
        Log.d("wuxu","sendIntent!!!")
        viewModelScope.launch {
            _intent.emit(intent)
        }
    }

    init {
        viewModelScope.launch(Dispatchers.IO+SupervisorJob()) {
            Log.d("wuxu","init!!!")
            _intent
                .onEach {
                    Log.d("wuxu","viewModelScope onEach $it")
                    realSendIntent(it)
                }
                .catch {
                    catchError(it)
                }
                .collect()
        }
    }
}

猜想原因只能有三个:

  1. scope被cancel;- 通过源码及日志输出判断,每次页面进入都会创建新的ViewModelScope,不存在cancel的情况;
  2. 协程域异常;- 这个我使用的是SupervisorJob(),所以排除
  3. collect()订阅,比emit晚。 - 最终确定是这个

最终日志输出:

正常:init->sendIntent 出问题时:sendIntent->init ,此时没有collect,导致无法触发流。

相关推荐
树下困觉眯2 小时前
View绘制流程学习--获取WindowManager的三种方式
android·系统架构·view design
vilya3 小时前
我怎么给手机 GUI Agent 做双通道感知:无障碍树为主,投屏像素兜底
android·人工智能
李子红了时4 小时前
阿狸舞台APP(安卓端手机EncFS解密+压缩包解压+视频播放)
android·音视频
事圆则缓4 小时前
Android 使用 Jenkins 实现 CI/CD,并用 SonarQube 建立质量门禁
android·ci/cd·jenkins
其实防守也摸鱼4 小时前
DeepSeek Harness 开源贡献手记:从 Issue 到 Merge 的完整旅程
android·数据库·学习·ai·oracle·自动化
恋猫de小郭4 小时前
Android CLI 支持 AI Agent 通过 Device Streaming 调试云真机
android·前端·flutter
素师良码1 天前
第5篇:显示驱动必备调试工具浅析
android
维克兜率天1 天前
【维克】配对交易的季节性:哪些品种适合长拿?
android·开发语言·笔记·python·算法·kotlin·量化
墨天梦1 天前
B06_XML控件布局与ViewBinding
android·kotlin
晚风叙码1 天前
MySQL 表的操作:从建表到删表,一篇讲清楚
android·mysql·oracle