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

理解LiveData Flow

如何启动取消协 Jetpack 组件里,我们为各个组件提供了对应的 scope,比如 ViewModel 就有与之对应的 viewModelScope,如果您想在这个作用域里启动使用如下代码即可...如前所述,我们使用 LiveData 连接 View ViewModel,而在 ViewModel 这里我们则使用刚刚提到的 liveData 构造方法来打通 LiveData 和协,再往右就是调用...我们从 Flow使用 collect 方法获取每一个结果,然后 emit 出来给 liveData 构造方法使用: val currentWeatherFlow: LiveData<String...相信看到这里,您对如何在实际应用中使用LiveData Flow 已经有了比较系统的认识。... Flow 有任何疑问想法,欢迎评论区和我们分享。

2.2K20

Flow 使用 LiveData | AndroidDevSummit 中文字幕视频

LiveData 也可以视图 ViewModel 双向通信范围之外工作,甚至连 Room 等其他组件也支持 LiveData。但是,滥用 LiveData 也会带来风险,尤其是涉及多线程的时候。...解决方法: 我们并没有扩展 LiveData 的功能,而让它可以无缝 Kotlin 整合工作。...本次演讲中,Jose Alcérreca Yigit Boyar 为大家讲解了全新的 LiveData 构建方法,何时以及如何使用它,以及一些用来打造简洁、高效强健的反应式 UI 的模式 (...请在观看主题演讲或分会场演讲时使用下方入口提交问题。...请使用如下地址提交问题: services.google.cn/fb/forms/as… 点击这里进入 Android Dev Summit 中文官方网站 ?

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

【Kotlin Flow 异步流 ⑥ ( 调用 Flow#launchIn 函数指定流收集 | 通过取消流收集所在的取消流 )

#launchIn 函数指定流收集 ---- 1、指定流收集 响应式编程 , 是 基于事件驱动 的 , Flow 流中会产生源源不断的事件 , 就是 发射元素操作 ; 拿到 Flow 流后...是 任务对象 , 可调用 Job#cancel 函数取消该任务 ; 2、Flow#launchIn 函数原型 Flow#launchIn 函数原型 : /** * 终端流操作符,[作用域]中...* * 此操作符通常与[onEach], [onCompletion][catch]操作符一起使用,以处理所有发出的值 * 处理上游流或处理过程中可能发生的异常,例如: * * ``` *...runBlocking 主 的子, 需要调用 join 等待执行完毕 } } /** * 使用 flow 构建器 Flow 异步流 *...---- Flow 流的 收集元素 操作 , 是中执行 , 将 取消 , 即可将 Flow 流收集操作 取消 , 也就是 将 Flow 流取消 ; 代码示例 : 使用 withTimeoutOrNull

73120

什么是_什么时候使用线程

先搞清楚,什么是。 你可能已经听过『进程』『线程』这两个概念。 进程就是二进制可执行文件计算机内存里的一个运行实例,就好比你的.exe文件是个类,进程就是new出来的那个实例。...,有几个特点: 协同,因为是由程序员自己写的调度策略,其通过协作而不是抢占来进行切换 在用户态完成创建,切换销毁 ⚠️ 从编程角度上看,的思想本质上就是控制流的主动让出(yield)恢复(resume...0)生成器正确使用 既然生成器不能像函数一样直接调用,那么怎么才能调用呢?...你可以使用下面的代码来测试: <?...3)堆栈 鸟哥文中还有一个堆栈的例子。 我们上面说过了,如果在函数中使用了yield,就不能当做函数使用。 所以你一个函数中嵌套另外一个函数: <?

67720

Google 推荐 MVVM 架构中使用 Kotlin Flow

Flow的扩展,如果要在 Room Retrofit 中使用,Room Retrofit 需要支持才可以, Retrofit >= 2.6.0 Room >= 2.1 版本都支持...,使用 LiveData 构造方法 (coroutine builder),这个方法也是 PokemonGo 项目中用到的方法。...的数据 emit(it) } } liveData{ ... } 构造方法提供了一个代码块,产生的是一个不可变的 LiveData,emit() 方法则用来更新...asLiveData 是 Flow 的扩展函数,返回值是一个 LiveData liveData{ ... } 构造方法提供了一个代码块, liveData{ ... } 中执行代码 collect...Observer { // 将数据显示页面上 }) 方式二: 使用 LiveData 构造方法 (coroutine builder) 提供的代码块,产生的是一个不可变的 LiveData

4.1K20

【Kotlin 的挂起恢复 ② ( 挂起 线程阻塞 对比 )

文章目录 一、挂起 线程阻塞 对比 1、挂起 2、线程阻塞 3、挂起阻塞对 UI 的影响 4、挂起分析 一、挂起 线程阻塞 对比 ---- 挂起是中的概念 , 只能在使用...; 阻塞是线程中的概念 , 可以主线程子线程中使用 ; 1、挂起 挂起 操作 : 使用 delay 函数 , 挂起 20 秒时间 , 然后 20 秒后更新 UI ; delay...函数是 挂起 suspend 函数 ; // 创建 GlobalScope.launch(Dispatchers.Main) { delay(20000) // 主线程更新 UI...Log.i("MainActivity", "GlobalScope : 主线程更新 UI") } 2、线程阻塞 主线程 阻塞 操作 : 主线程 中使用 Thread.sleep 函数 , 阻塞 20..., 会将挂起点的状态保存 , 同时停止执行 , 等待挂起函数执行完毕后 , 继续执行 ; 相当于阻塞的是 , 不会阻塞主线程 ;

1.7K20

LiveData 迁移到 Kotlin 数据流

稍后我们会了解到 LiveData 还可以 启动 创建复杂的数据转换,这可能会需要花点时间。...接下来我们一起比较 LiveData Kotlin 数据流中相对应的写法吧: #1: 使用可变数据存储器暴露一次性操作的结果 这是一个经典的操作模式,其中您会使用的结果来改变状态容器: △ 将一次性操作的结果暴露给可变的数据容器...liveData 构建器所使用的方法是 添加一个 5 秒钟的延迟,即如果等待 5 秒后仍然没有订阅者存在就终止。...Activity Fragment 提供了若干构建器: Activity.lifecycleScope.launch : 立即启动,并且本 Activity 销毁时结束。...Fragment.lifecycleScope.launch : 立即启动,并且本 Fragment 销毁时结束

1.4K20

有栈无栈

),并且通过接口coroutine_resume调度器下面创建了两个协co1co2,然后通过调度器循环去拉起其中一个,直到一个执行完毕。...cap/size:栈的容量当前使用栈空间的大小 status,的状态信息,是处于就绪状态(COROUTINE_READY)?...而libco基于性能优化考虑,没有使用ucontext,而是自己用汇编写了一套上下文切换的代码,文件coctx_swap.S里面,他这里面只保存恢复了寄存器内存栈内容,相比于ucontext,少了浮点数上下文...一开始,我们就把sp指向我们的栈空间,所以内发生函数调用的时候,被调函数的函数头会有mov rsp rbppush rbp,此时实际rbp也是指向我们分配的栈空间,所以真正栈空间里面是ebpesp...,引发执行流程错乱(所以使用这类库的时候,应该将函数的实现和协主流程分开,以避免因为逻辑修改导致不可恢复的场景) 对于无栈来说,执行流的恢复只是通过找到下一条指令的执行地址,但是不包括上下文

4.6K43

再谈程之viewmodel-livedata难兄难弟

其实不能叫扯上关系吧,ViewModelLiveData属于「架构组件」,而是「异步工具类」,ViewModelLiveData搭上了这条快车道,让Google推了几年的AAC架构更加快的让人接受了...这两哥们可谓是形影不离,网上的很多文章,几乎也都会同时提到它们,但是...当Flow稳定之后,这两个好兄弟就突然出现了隔阂,当然,其实隔阂绝不是一天就有的,这也许是压死LiveData的最后一根稻草...,毕竟没法Java中使用)。...的构造器提供了一个代码块,这就是LiveData作用域,当LiveData被注册的时候,作用域中的代码就会被执行,而当LiveData不再被使用时,里面的操作就会因为结构化并发而取消。...而且该构造器返回的是一个不可变的LiveData,可以直接暴露给对应的UI层使用作用域中,可以通过emit()函数来更新LiveData的数据。 这样整体流程就通了,而且,非常简单不是吗?

1.1K40

LiveData:还没普及就让我去世?我去你的 Kotlin

我要说的是 Kotlin,Kotlin 2017 得到了 Android 官方的公开支持,接下来这几年里,Kotlin 自身越来越完善,它的也越来越完善。...Flow RxJava 的功能范围非常相似——其实我觉得就是一样的——但是 Flow里必不可少的一部分,而是 Kotlin 里必不可少的一部分,而 Kotlin 是 Android...FlowLiveData使用比较简单,而且功能上对于简单场景也是足够的,而 RxJava Flow 这种东西学起来就没 LiveData 那么直观。...简单说就是,为了 Java 语言的使用不想学 RxJava 或者 Flow 的人,LiveData 会被保留。不过你如果用发展的眼光去看他这番话……你懂我意思吧? 那我走?...另一方面,在用 LiveData 的人,确实可以考虑摘除它了;但也不是着急忙慌地把它拿走,它不是毒药不是地雷,只是Flow 现在可以做这件事了,而未来 Flow 一定是会成为主流的,就像现在的

90150

【Kotlin 的挂起恢复 ① ( 的挂起恢复概念 | 的 suspend 挂起函数 )

文章目录 一、的挂起恢复概念 二、的 suspend 挂起函数 一、的挂起恢复概念 ---- 函数 最基本的操作 是 : 调用 call : 通过 函数名或函数地址 调用函数 ; 返回...return : 函数执行完毕后 , 继续执行函数调用的下一行代码 ; 调用 call 返回 return 基础上 , 又新增了两种 状态 : 挂起 Suspend : 暂停当前执行的..., 只能在 体内部 或者 其它挂起函数 中调用 ; 外部不允许使用挂起函数 ; 中 , 执行 挂起 Suspend 函数 , 将 挂起点的信息 记录下来 , 然后执行耗时操作 , 执行完毕后...恢复 Resume ; 二、的 suspend 挂起函数 ---- 声明挂起函数 , 使用 suspend fun 关键字之前 修饰函数 , 如 : public suspend fun Test...){} 中 , 可以直接调用挂起函数 ; 挂起 函数 , 只能在 体内部 或者 其它挂起函数 中调用 ; 外部不允许使用挂起函数 ; 中 , 执行 挂起 Suspend 函数 , 将 挂起点的信息

1.5K40

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

之前的Flow,collect函数浅析仿Flow构建器创建数据流文章中我们探索了flow的简单使用及它的简单原理,但是生产过程中我们往往会借用这些基础的api实现我们复杂的逻辑处理,根据需求也推出了...接下来开始看下这几个Flow的特殊之处应用场景吧~~官方推荐的Flow数据流流向:数据流程数据流包含三个实体:提供方会生成添加到数据流中的数据。得益于,数据流还可以异步生成数据。...类似于观察数据,数据更新,使用方接受最新数据是不是LiveData很像。...: 对于LiveData来说,通过观察调用observe函数的时候传入LifecycleOwner内部注册生命周期回调的方式相比;Flow的观察collect函数需要在中调用也就是需要自动管理的生命周期...但是我们可以使用repeatOnLifecycle,它当离开某个生命周期的时候进行取消,符合的时候开启一个新(也即会重新执行collect函数是新的订阅者)。

59440

(StateFlow & ShareFlow) VS (Flow & LiveData

theme: condensed-night-purple highlight: vs 之前的Flow,collect函数浅析仿Flow构建器创建数据流文章中我们探索了flow的简单使用及它的简单原理...接下来开始看下这几个Flow的特殊之处应用场景吧~~ 官方推荐的Flow数据流流向: 数据流程 数据流包含三个实体: 提供方会生成添加到数据流中的数据。得益于,数据流还可以异步生成数据。...类似于观察数据,数据更新,使用方接受最新数据是不是LiveData很像。...确实像,但他比LiveData更强大~~ StateFlow 线程切换:相比于LiveData更新数据的操作只能在主线程进行,但是Flow可以通过flowOn来不同的Dispatchers(线程分发器...但是我们可以使用repeatOnLifecycle,它当离开某个生命周期的时候进行取消,符合的时候开启一个新(也即会重新执行collect函数是新的订阅者)。

97740

什么是线程的区别

IO 发展历史没有的时代,处理 IO 操作我们一般使用下面三种方式:同步编程应用程序阻塞等待IO结果(比如等待打开一个大的文件,或者等待远端服务器的响应)。...与传统的操作系统线程相比,更轻量级,切换开销更小,因此高并发场景中非常高效。...许多现代编程语言中都有实现,包括 Go、Python、JavaScript(某种程度上通过异步函数生成器)等。...go 示例代码下面是一个使用 Go 协作的示例,这个示例展示了如何使用 sync.WaitGroup channel 来实现程之间的协作:package mainimport ("fmt""sync...("Main: Received", val)}}()wg.Wait() // 等待所有 worker 完成}线程的区别属于用户级线程,线程属于内核级线程,线程的创建、上下文切换远比消耗更大

9920

Android 开发中使用 | 背景介绍

invoke (或 call) return 之外,新增了 suspend resume: suspend — 也称挂起或暂停,用于暂停执行当前,并保存所有局部变量; resume —...您只能够 suspend 函数中调用另外的 suspend 函数,或者通过构造器 (如 launch) 来启动新的。 搭配使用 suspend resume 来替代回调的使用。...Kotlin 提供了三个调度器,您可以使用它们来指定应在何处运行: 如果您在 Room 中使用了 suspend 函数、RxJava 或者 LiveData,Room 会自动保障主线程安全。...此外, Dispatchers.Default Dispatchers.IO 中进行切换也得到了优化,以尽可能避免了线程切换所带来的性能损失。 下一步 本篇文章介绍了使用来解决什么样的问题。... Android 平台上,您可以使用来处理两个常见问题: 似于网络请求、磁盘读取甚至是较大 JSON 数据解析这样的耗时任务; 线程安全,这样可以不增加代码复杂度保证代码可读性的前提下做到不会阻塞主线程的执行

1.5K30
领券