以感知生命周期的方式观察 Flow 数据
问题
- Android 是有生命周期的,在 UI 展示的时候可以接受一些数据更新 UI,在 App 进入后台的时候应该停止接受数据以便释放资源,并且避免一些意想不到的异常;
- 协程和 Flow 是和 Android 平台无关的 API,正常情况下无法感知 Android 生命周期方法;
解决方案
我们现在当然是有一些方案来解决上述问题,可能会有以下几种方式。
方式一:手动取消 Job
Activity 方式:
Fragment 方式:
以上方式显然是比较麻烦的,有一些模板代码。
方式二:使用 repeatOnLifecycle 解决模板代码
Activity 方式:
Fragment 方式:
注:需要添加依赖
androidx.lifecycle:lifecycle-runtime-ktx
这种方式虽然解决了一些模板代码的问题,但是仍然有多层嵌套的问题。
方式三:使用 flowWithLifecycle
解决多层嵌套
Activity 方式:
注:此 API 是在 2.6.0-alpha01 版本中添加。
Fragment 方式类似,使用 flowWithLifecycle
即可。flowWithLifecycle
是新版中新增的一个扩展函数,实现方式如下:
看上去是解决了嵌套的问题,但是并彻底,观察数据的操作还是需要在协程体中进行。
方式四:使用 collectWithLifecycle
彻底解决多层嵌套
自定义扩展函数 collectWithLifecycle
实现大致如下:
这个是我自己的一个扩展,官方库中并没有添加,不过我已经反馈给官方了。这种方式仅仅是解决了嵌套的问题,但是却隐藏了 Flow ,从而导致一系列的操作符将无法使用,不过这个在 UI Element/Compose 中并不是什么大问题。。
扩展阅读
处理 Android UI 的方式之外,Compose 本身也有同样的问题,官方也通过自定义扩展函数的形式添加了支持,大致如下:
作者:RethinkAndroid
链接:https://juejin.cn/post/7158876836112367629
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接:https://juejin.cn/post/7158876836112367629
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。