android源码宇宙-StateFlow

简介: android源码宇宙-StateFlow

用法


image.png

image.png


源码


collect添加观察者

  1. MutableStateFlow.collect

collect是一个扩展方法,是唯一入口

下一步就是找到真实Flow实现类里面的collect方法

image.png

  1. 查看MutableStateFlow的实现,MutableStateFlow的真实实现类是StateFlowImpl

image.png

image.png


  1. StateFlowImpl.collect方法

下图中的freeSlot(slot)我们需要说明一下,它实际上就是用来释放当前位置的观察者的,当while结束的时候就会调用freeSlot来释放当前观察者对应的状态。 下面的slot.awaitPending()方法也需要说明一下,他实际上就是在我们更新完一次数据后重新将我们的协程挂起,等待下一次数据更新到来

image.png

image.png


StateFlow.value更新数据

  1. StateFlowImpl.setValue

image.png

image.png

  1. updateState方法

image.png

image.png


其它


StateFlow中的状态介绍

image.png

image.png


StateFlow是如何管理多个观察者的

StateFlow使用StateFlowSlot来管理状态,因为StateFlow有多个观察者,所以会使用数组来管理StateFlowSlot

这个StateFlowSlot内部管理了当前观察者的状态,每当我们添加观察者、遍历观察者给每个观察者回调数据、取消观察者的时候都会更改这个StateFlowSlot的状态。

  1. 首先来到StateFlowImpl.collect方法

image.png

image.png

  1. 看一下allocateSlot方法

因为我们的StateFlowImpl实现了AbstractSharedFlow,所以该方法在AbstractSharedFlow中

image.png

  1. StateFlowImpl.createSlot方法

image.png

image.png


StateFlow.collect如何实现多次挂起,多次收到回调数据

实际上就是每一个collect方法内部都维护了一个死循环,每次到来新数据的时候都会调用emit更新新数据,同时将协程重新挂起,等待下一次数据到来的时候再结束挂起。

  1. StateFlowImpl.collect

image.png

image.png

  1. awaitPending

image.png

image.png


StateFlow.value设置新值的时候是如何结束所有观察者的挂起状态的

结论:我们知道,每次给StateFlow更新完数据后,都会将协程重新挂起,挂起的过程中会顺便把协程的Continuation赋值给StateFlowSlot对应的_state。当我们新数据到来的时候会调用_state(Continuation).resume来恢复协程,协程结束挂起状态。

  1. StateFlowImpl.updateState

起点是这个方法

重点StateFlowSlot.makePending

image.png

image.png

  1. StateFlowSolt.makePending

image.png

进一步我们可能会想这个_state为什么会是一个协程挂起对象,他是在哪里设置的,见下图:

image.png


总结


相较于LiveData,StateFlow的实现更加简练,它不依赖于我们的生命周期,因此控制StateFlow的状态只需要管理好包裹它的父协程状态即可。

工作原理:

StateFlow使用collect方法注册观察者,每一个观察者内部都维护了一个死循环,当数据更新完成的时候会将协程挂起保证死循环不退出。

每一个StateFlow都会维护一个StateFlowSlot的数组(可以称之为状态槽slots)用来管理每个观察者的状态。当我们调用collect方法注册了一个观察者的时候,首先会将StateFlow中当前的值回调给观察者,然后StateFlow会将观察者的协程挂起,等待下一次数据更新到来。

当下一次数据到来的时候,StateFlow会将数据更新到最新值,然后会遍历slots,将所有观察者对应的协程结束挂起,这样所有的观察者,会继续在死循环中去读取StateFlow中的最新值,并回调。



相关文章
|
9月前
|
开发工具 Android开发 git
Windows下载android2.2完整源码(转)
Windows下载android2.2完整源码(转)
113 3
|
6月前
|
Ubuntu 开发工具 Android开发
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
本文介绍了在基于Ubuntu 22.04的环境下配置Python 3.9、安装repo工具、下载和同步AOSP源码包以及处理repo同步错误的详细步骤。
392 0
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
|
9月前
|
Java 开发工具 Android开发
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
77 4
|
9月前
|
Java Android开发
Android12 双击power键启动相机源码解析
Android12 双击power键启动相机源码解析
217 0
|
6月前
|
开发工具 git 索引
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
223 1
|
6月前
|
Android开发 Docker 容器
docker中编译android aosp源码,出现Build sandboxing disabled due to nsjail error
在使用Docker编译Android AOSP源码时,如果遇到"Build sandboxing disabled due to nsjail error"的错误,可以通过在docker run命令中添加`--privileged`参数来解决权限不足的问题。
1229 1
|
6月前
|
API 开发工具 Android开发
Android源码下载
Android源码下载
706 0
|
6月前
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
852 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
|
6月前
|
Java Android开发 芯片
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
351 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
|
6月前
|
Android开发
我的Android 进阶修炼(1): AOSP源码根目录结构
本文介绍了AOSP源码的根目录结构,提供了基于MTK9269 Android 9.0源码的目录说明,帮助读者了解AOSP源码的组织方式和各目录的功能。
307 0
我的Android 进阶修炼(1): AOSP源码根目录结构

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 6
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 7
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 10
    Android学习自定义View(四)——继承控件(滑动时ListView的Item出现删除按钮)