首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Google推荐Compose中使用collectAsStateWithLifecycle替代collectAsState

写在前面 以生命周期感知方式收集流 Android 上收集流的推荐方式。...,collectAsStateWithLifecycle 的实现使用了 repeatOnLifecycle API,这是 Android 中使用 View 系统收集流的推荐方式。...流的消费者和生产者不需要知道彼此是如何实现的。 具有多个环境、变体、库和功能的大型应用程序找出实现细节可能非常耗时。 更糟糕的是,维护依赖于实现细节的代码非常困难。...与collectAsState 比较 开发者经常会问:如果 collectAsStateWithLifecycle 是从 Android 的可组合函数集流的最安全方式,为什么我们现在需要 collectAsState...::followAuthorToggle,     ) } 以生命周期感知方式收集流 Android 上收集流的推荐方式,以使您的应用程序的其他部分能够需要时释放资源。

3.2K20

从 LiveData 迁移到 Kotlin 数据流

如果设置为 0,可以符合条件时立即重置缓存的数据。 从视图中观察 StateFlow 我们此前已经谈到,ViewModel 的 StateFlow 需要知道它们已经不再需要监听。...对此,需要注意对应的协程只有它们的生命周期所有者被销毁时才会被取消。...lifecycle.repeatOnLifecycle 前来救场 这个新的协程构建器 (自 lifecycle-runtime-ktx 2.4.0-alpha01 后可用) 恰好能满足我们的需要: 某个特定的状态满足时启动协程...{ ... } } } } 当这个 Fragment 处于 STARTED 状态时会开始收集流,并且 RESUMED 状态时保持收集,最终 Fragment 进入 STOPPED...❌ 通过 Lazily/Eagerly 策略暴露 StateFlow,并在 repeatOnLifecycle 收集数据更新。

1.4K20
您找到你想要的搜索结果了吗?
是的
没有找到

实战 | 使用 Kotlin Flow 构建数据流 管道

Flow 是一种基于流的编程模型,本文我们将向大家介绍响应式编程以及其 Android 开发的实践,您将了解到如何将生命周期、旋转及切换到后台等状态绑定到 Flow ,并且测试它们是否能按照预期执行...于是他湖边安装了一些管道,当湖中有水时,只用拧开水龙头就能取到水。知道了如何安装管道,就能很自然地想到从多个水源地把管道组合,这样一来 Pancho 就不必再检查湖水是否已经干涸。...△ 铺设管道 Android 应用您可以简单地每次需要时请求数据,例如我们可以使用挂起函数来实现在每次视图启动时向 ViewModel 请求数据,而后 ViewModel 又向数据层请求数据,接下来这一切又在相反的方向上发生...catch 运算符还可以在有需要的时候再次抛出异常或者发送新值,我们示例代码可以看到其捕获到 IllegalArgumentExceptions 时将其重新抛出,并且发生其他异常时发送一个空列表...在上面的例子,我们使用了 Activity 的 lifecycleScope 来启动协程,由于 repeatOnLifecycle 是挂起函数,所以它需要在协程中被调用。

1.4K10

毫米波雷达里程计是否需要扫描帧匹配?

实验,平均位置误差可以低至1.8和4.5公里行程的0.3%。这使得特征稀疏的矿山环境等低能见度条件下,也能够准确估计6自由度的自身运动。...我们选择原始的ekf-rio版本,因为它不需要精确的雷达触发信号,不幸的是我们无法从雷达获取该信号。...实验,我们配置建图方法以向地图中添加新点,直到达到由最小点之间的最小距离定义的最大密度,该最小距离我们的实验为0.1米。点到面ICP还需要基于地图中每个点周围的局部几何形状估计法线向量。...我们的实验,使用了15个最近的点。值得注意的是,初步测试表明,当该建图方案雷达数据上进行部署时,需要先前的运动估计。因此在所有实验中将多普勒+IMU的姿态作为先验提供。...这使得该方法适用于恶劣环境运行的资源受限机器,例如矿业的重型机械。未来的工作,我们将调查Eagle雷达多普勒速度不准确的原因,并将雷达里程计扩展为完整的SLAM解决方案。

24310

(StateFlow & ShareFlow) VS (Flow & LiveData)

theme: condensed-night-purple highlight: vs 之前的Flow,collect函数浅析和仿Flow构建器创建数据流文章我们探索了flow的简单使用及它的简单原理...字段决定获取之前的几次数据更新 生命周期处理: 对于LiveData来说,通过观察调用observe函数的时候传入LifecycleOwner内部注册生命周期回调的方式相比;Flow的观察collect函数需要在协程调用也就是需要自动管理协程的生命周期...但是我们可以使用repeatOnLifecycle,它当离开某个生命周期的时候进行取消,符合的时候开启一个新协程(也即会重新执行collect函数是新的订阅者)。...Android官方的警告:倾向于使用 repeatOnLifecycle API 收集数据流,而不是 launchWhenX API 内部进行收集。...由于后面的 API 会挂起协程,而不是 Lifecycle 处于 STOPPED 状态时取消。上游数据流会在后台保持活跃状态,并可能会发出新的项并耗用资源。 需要给定一个初始值。

98240

(StateFlow & ShareFlow) VS (Flow & LiveData)来看业务适合哪个?

之前的Flow,collect函数浅析和仿Flow构建器创建数据流文章我们探索了flow的简单使用及它的简单原理,但是生产过程我们往往会借用这些基础的api实现我们复杂的逻辑处理,根据需求也推出了...: 对于LiveData来说,通过观察调用observe函数的时候传入LifecycleOwner内部注册生命周期回调的方式相比;Flow的观察collect函数需要在协程调用也就是需要自动管理协程的生命周期...但是我们可以使用repeatOnLifecycle,它当离开某个生命周期的时候进行取消,符合的时候开启一个新协程(也即会重新执行collect函数是新的订阅者)。...Android官方的警告:倾向于使用 repeatOnLifecycle API 收集数据流,而不是 launchWhenX API 内部进行收集。...由于后面的 API 会挂起协程,而不是 Lifecycle 处于 STOPPED 状态时取消。上游数据流会在后台保持活跃状态,并可能会发出新的项并耗用资源。需要给定一个初始值。

63140

Kotlin Flow响应式编程,StateFlow和SharedFlow

Flow的生命周期管理 首先,我们接着 Kotlin Flow响应式编程,基础知识入门 这篇文章编写的计时器例子来继续学习。...另外,MainViewModel的代码这里我也贴上吧,虽然它是完全没有改动的: class MainViewModel : ViewModel() { val timeFlow = flow...正确使用repeatOnLifecycle函数,这样才能让我们的程序使用Flow的时候更加安全。...首先,MutableSharedFlow是不需要传入初始值参数的。因为非粘性的特性,它本身就不要求观察者观察的那一刻就能收到消息,所以也没有传入初始值的必要。...总体改动就是这么多,MainActivity的代码是不需要做修改的,现在让我们重新运行一下程序吧: 可以看到,这次当我们再旋转一下屏幕,不会再像刚才那样又弹出一次Toast了,说明SharedFlow

44910

解决Android开发的痛点问题用Kotlin Flow

项目由MVP过渡到MVVM时,其中一个典型的重构手段就是将Presenter的回调写法改写成ViewModel持有LiveData由View层订阅,比如以下场景: 大力自习室,当老师切换至互动模式时...然后开启灵魂三问: 在生命周期组件消费Channel是否会内存泄漏? 不会,因为Channel并不会持有生命周期组件的引用,并不像LiveData传入Observer式的使用。 是否支持线程切换?...支持,对Channel的收集需要开启协程,协程可以切换协程上下文从而实现线程切换。 观察者非活跃状态下是否还会消费事件?...也可以使用repeatOnLifecycle(State) 来UI层收集,当生命周期 < State时,会取消协程,恢复时再重新启动协程。...那么回到我们的问题,这里用冷流是否可行?显然并不合适,因为首先直观上冷流就无法构造器以外发射数据。

3.2K20

让Flows感知生命周期

lifecycle:lifecycle-runtime-ktx的2.4版本引入了API来帮助这方面的工作:repeatOnLifecycle和flowWithLifecycle(要了解更多关于这些的信息...从Android UIs收集Flow的更安全的方法),在这篇文章,我们将尝试它们,我们将讨论它们某些情况下带来的一个小问题,我们将看看我们是否能想出一个更灵活的解决方案。...❞ 现在,我们Fragment要做的就是听从对viewState更新的反应,并更新UI。...Solution using the official APIs 保持使用flowWithLifecycle的同时,官方的解决方案Jose Alcérreca的文章做了解释,它是使用stateIn...Flow,而不仅仅是收集过程,正如我们所看到的,将它应用于上游的触发Flow(我们的例子是位置更新),导致更少的计算。

72820

Android Dev Summit 21 精彩内容盘点

需要注意,如果你的项目中通过 android:windowBackground 或者 CustomActivity 的方式自定义了开屏页,则需要进行适配,避免 Android12 中出现两次开屏 Foreground...{ } 收集 Flow 的数据避免泄露,但是从性能出发更推荐使用 repeatOnLifecycle: //imprort androidx.lifecycle.repeatOnLifecycle...lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.userMessages.collect...活动期间有网友直播询问是否还有 Flow 无法取代 LiveData 的场景,官方的回答是 LiveData 除了 API 更简单以外(相应的功能也比较弱),已经完全可以被 Flow 替代。...,会发生 ForegroundServiceStartNotAllowedException 异常,这是开发需要特别注意的。

1.7K20

设计 repeatOnLifecycle API 背后的故事

repeatOnLifecycle 是一个挂起函数 。就其本身而言,它需要在协程执行。...repeatOnLifecycle会将调用的协程挂起,然后每当生命周期进入 (或高于) 目标状态时一个新的协程执行您作为参数传入的一个挂起块。...它是您在编写正确的代码时需要特别注意的隐藏陷阱。这一点正是我们关于是否要在函数库避免 repeatOnLifecycle 之上提供封装接口的争论所在。... repeatOnLifecycle 上下的代码可读性高,并且对于新人来说更有意义: "首先,我需要启动一个跟随 UI 生命周期的新协程。...如果您需要repeatOnLifecycle API 之上创建封装函数以涵盖您的应用更常见的应用场景,请一定问问自己是否真的需要它,或者是为什么需要它。

82021

Kotlin 学习笔记(五)—— Flow 数据流学习实践指北(一)

流的执行也被称之为收集流,并且是以挂起的方式,不是阻塞的。流最终的执行成功与否取决于流上的操作是否全部执行成功。collect 函数就是最常见的收集流函数。...Flow 也是相同的工作原理,Flow 调用 collect 操作符收集流之前,Flow 构建器和中间操作符都不会执行。...先来看一个最简单的例子: 5.1 单接口请求 现在一般都是 ViewModel 里持有 LiveData 数据,并且进行数据的请求,所以先来看下 ViewModel 的代码实现: //code 14...这就需要用到之前说的 Flow 的 zip 操作符了。...但后面的 collect 操作符执行的代码是主线程,感兴趣的同学可以打印线程信息看看,这就需要了解一下 flowOn 操作符的用法了。

1.5K10

AndroidJetpack Livedata应用场景分析

中注册 Livedata 监听(因为 onStart 和 onResume 中进行监听可能会有冗余调用) Livedata 简单使用 仍然还是用我们倒计时的例子, Viewmodel 开始一个...本例实现的 demo 效果是,创建一个全局的倒计时,然后 Activity 添加两个按钮,点击后可以切换 FragmentA 和 FragmentB。...activity 中观察 viewmodel 的数据更新,当点击 activity 按钮的时候会调用 viewmodel.sendData 方法发送数据,然后发送的数据会做一定的转换给 activity...: activity 中观察 viewmodel 的数据更新,当点击 activity 按钮的时候会调用 viewmodel.sendData 方法发送数据,然后发送的数据会做一定的转换给 activity...,任务处理完成后刷新 ui 这种情况可以使用 Livedata 的扩展程序实现 本例我们实现下面的逻辑: viewmodel 阻塞 4s,然后通知 activity 代码: 引入依赖插件 implementation

1K20

MVVM的数据持久化(二)——ROOM的使用

修改Model层 这里我们需要修改一下Model层,添加Repository作为ViewModel层的数据源,Repository里我们进行数据的处理判断 package yang.cehome.com.mvvmdemo.model.repository...PostRepo constructor(private val remote: PostService, private val local: PostDao){ //首先查看本地数据库是否有数据...项目结构 修改我们的ViewModel层的数据源 以前我们都是以PostService作为数据源,现在我们要以PostRepo作为数据源,这里我们只需要修改 package yang.cehome.com.mvvmdemo.viewmodel...但是就目前的方法来说,每次都需要写的模板化的代码太多了,那么我们有没有什么办法简化呢,答案必然是有的。 后面的文章我们会持续介绍到,希望大家持续关注。..."context": "【宁波市】 【宁波】(0574-88014756、0574-88016531、0574-88014575) 的 宁海电商产业园区 (15990572220) 已揽"

72850

谁能取代Android的LiveData- StateFlow or SharedFlow?

在这种情况下,你可以通过使用Flow.asLiveData()扩展函数ViewModel轻松地从Flow转换为LiveData。...现在,我们可能会认为我们的活动不需要调整。错了! 有一个问题:当在一个用 launchWhenStarted {} 启动的 coroutine 集流量时,coroutine 将会暂停。..."我真的需要在任何时候用myFlow.value访问流的当前状态吗?" ❝如果这个问题的答案是否定的,你可以考虑SharedFlow。❞ "我是否需要支持发射和收集重复值?"...❝如果这个问题的答案是肯定的,你将需要SharedFlow。❞ "我是否需要为新的订阅者重放超过最新的值?" ❝如果这个问题的答案是肯定的,你将需要SharedFlow。...有时你需要不忽略重复的值,例如:一个连接尝试,将尝试结果存储一个流,每次失败后需要重试。 另外,它需要一个初始值。

1.5K20
领券