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

从 LiveData 迁移到 Kotlin 数据流

#2: 把一次性操作的结果暴露出来 这个例子与上面代码片段的效果一致,只是这里暴露协程调用的结果而无需使用可变属性。...继续刚才的例子: 我们不再对源数据调用 fetchItem 方法,而是通过假定的 observeItem 方法获取一个 Kotlin 数据流。...在这种情况下此参数非常适合,由于缓存的数据都恢复成了 stateIn 中定义的初始值,因此可以有效节省内存。虽然用户切回应用时可能没那么快显示有效数据,但至少不会把过期的信息显示出来。...它的默认值是长整型的最大值 Long.MAX_VALUE (表示永远不将其重置)。如果设置为 0,可以在符合条件时立即重置缓存的数据。...对于数据绑定,您应该在各处都使用 Kotlin 数据流并简单地加上 asLiveData() 来把数据暴露给视图。

1.4K20

【译】LiveData-Flow在MVVM中的最佳实践

但是在获取数据流的时候呢? 这里就是Flow发挥作用的地方。如果你想从你的服务器上获取实时更新,你可以用Flow来做,而不用担心资源的泄露,因为结构化的并发性迫使你这样做。...,我们可以看到它在观察数据流的同时更新文本字段,并没有阻塞UI。...在Activity层面上消费主题更新是更好的,因为所有来自其他Fragment的更新都可以被安全地观察到。 让我们在ViewModel中获取主题更新。...Say to LiveData 使用LiveData可以确保在生命周期所有者销毁的情况下,你不会泄露任何资源。如果我告诉你,你几乎可以(后面会解释为什么不一样,但几乎)用Flow获得同样的好处呢?...只需使用catch操作符来捕捉下行流中的任何错误。

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

    LiveData Coroutine Builder的5个诡计

    Connect Kotlin Coroutine to LiveData 如果我们有一个需要调用的coroutine,以获取一些数据到LiveData,我们可以做以下工作。...但如果我们有一个流程,其中数据是连续排放的,我们可以使用: val someTypeLiveData: LiveData = stateFlow.asLiveData(...在内部对于asLiveData实际上也是一个LiveData {...}。...如果它在之前的运行中成功完成,它不会重新启动。注意,只有在自动取消的情况下才会重新启动。如果该块因任何其他原因被取消(例如抛出一个CancellationException),它不会被重新启动。...如果coroutine在超时前完成,即使Activity还没有恢复,coroutine也不会被重新启动,而只是发出它的最后一个值。

    1.5K60

    协程 Flow 最佳实践 | 基于 Android 开发者峰会应用

    由于末端操作符 (terminal operator) 会触发数据流的执行,同时会根据生产者一侧流操作来决定是成功完成操作还是抛出异常,因此 Flows 会自动地关闭数据流,您基本不会在生产者一侧泄漏资源...在这种情况下,当新的监听者开始消费事件时,生产者不需要每次都被执行。 您依然可以向调用者提供 Flow,它们不需要知道具体的实现。...不过,关闭这个特殊的 Flow 不会取消订阅。当使用 BroadcastChannel 的时候,您必须自己管理生命周期。...Flow 的实现 如果您想将一个基于回调的流 API 转换为使用 Flow,您可以使用 channelFlow 函数 (当然也可以使用 callbackFlow,它们都基于相同的实现)。...在消费者关闭或者 API 调用 onCompleted/onError 函数之前,请保证数据流 // 一直处于打开状态。

    3.5K11

    Google 推荐在 MVVM 架构中使用 Kotlin Flow

    Flow 库是在 Kotlin Coroutines 1.3.2 发布之后新增的库,也叫做异步流,类似 RxJava 的 Observable 、 Flowable 等等,所以很多人都用 Flow 与...方法三: 调用 Flow 的扩展方法 asLiveData() 返回一个不可变的 LiveData,供 Activity 或者 Fragment 调用。...为什么说调用 asLiveData() 方法会返回一个不可变的 LiveData,我们来看一下源码: fun Flow.asLiveData( context: CoroutineContext...).observe(this, Observer { // 将数据显示在页面上 }) 方式三: 调用 Flow 的扩展方法 asLiveData() 返回一个不可变的 LiveData,在 Activity...,如果使用过 RxJava 的小伙伴们应该会非常熟悉,对于没有使用过 RxJava 的小伙伴们,入门的门槛也是非常低的,强烈建议至少体验一次,体验过之后,我认为你会跟我一样爱上它的。

    4.5K21

    【译】LiveData with Coroutines and Flow

    然而,有一件重要的事情要记住:coroutine的取消是协作式的。 这意味着,如果调用的coroutine被取消了,你必须帮助Kotlin停止一个Job。...调用它们是运行非阻塞操作的一种非常方便的方法。...Flow类似于RxJava中的反应式流功能。 然而,虽然轮子让非阻塞的一次性操作变得更容易,但这对Flow来说并不是同样的情况。Flow仍然是难以掌握的。...当我们有一个新的Value时,我们调用offer方法 当我们想停止发送更新时,我们调用close(cause?)...即使是非常有前途的StateFlow(目前是实验性的),我们仍然有Java编程语言和DataBinding的用户需要支持,所以它在一段时间内不会被废弃 :) 原文链接:https://medium.com

    1.4K10

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

    而 catch 运算符则可以捕获上游数据流中发生的异常,上游数据流是指在生产者代码块和当前运算符之间调用的运算符产生的数据流,而在当前运算符之后生成的数据流则被称为下游数据流。...,不过需要注意的是,直到生命周期进入 DESTROYED,调用 repeatOnLifecycle 的协程都不会恢复执行,因此如果您需要从多个数据流中进行收集,则应在 repeatOnLifecycle...如果您调用 repeatOnLifecycle 并传入 STARTED 状态,界面就只会在屏幕上显示时收集数据流发出的信号,并且在应用转到后台时取消收集。...在旋转场景中我们不希望重启任何数据流以便尽可能快地完成过渡,而在回到主屏幕的场景中我们则希望停止所有数据流以便节省电量和其他资源。...我们可以通过设置超时时间来正确判断不同的场景,当停止收集 StateFlow时,不会立即停止所有上游数据流,而是会等待一段时间,如果在超时前再次收集数据则不会取消上游数据流,这就是 WhileSubscribed

    1.5K10

    MVI 架构

    要了解MVI架构,我们首先来了解下MVVM架构有什么不足,相信使用MVVM架构的同学都有如下经验,为了保证数据流的单向流动,LiveData向外暴露时需要转化成immutable的,这需要添加不少模板代码并且容易遗忘...这其实就是我通过MVVM架构写比较复杂页面时最难受的点。其次就是View层通过调用ViewModel层的方法来交互的,View层与ViewModel的交互比较分散,不成体系。...后发送给Model层进行数据请求 单向数据流 MVI强调数据的单向流动,主要分为以下几步: 用户操作以Intent的形式通知Model Model基于Intent更新State View接收到State...变化刷新UI 数据永远在一个环形结构中单向流动,不能反向流动: 图片 上面简单的介绍了下MVI架构,下面我们一起来看下具体是怎么使用MVI架构的。...,同时所有调用以Action的形式汇总到一处,也有利于对行为的集中分析和监控。

    5410

    MVVM 进阶版:MVI 架构了解一下~

    ,这其实是单一数据源而不是双向数据绑定,所以其实MVVM的这一大特性我其实并没有用到 View通过调用ViewModel提供的方法来与ViewMdoel交互 小结 MVC架构的主要问题在于Activity...要了解MVI架构,我们首先来了解下MVVM架构有什么不足 相信使用MVVM架构的同学都有如下经验,为了保证数据流的单向流动,LiveData向外暴露时需要转化成immutable的,这需要添加不少模板代码并且容易遗忘...其次就是View层通过调用ViewModel层的方法来交互的,View层与ViewModel的交互比较分散,不成体系 小结一下,在我的使用中,MVVM架构主要有以下不足 为保证对外暴露的LiveData...MVI中的View通过订阅Model的变化实现界面刷新 Intent: 此Intent不是Activity的Intent,用户的任何操作都被包装成Intent后发送给Model层进行数据请求 单向数据流...数据永远在一个环形结构中单向流动,不能反向流动: [1240] 上面简单的介绍了下MVI架构,下面我们一起来看下具体是怎么使用MVI架构的 MVI架构实战 --------- 总体架构图 [1240

    2.1K20

    CPU片上环互联的侧信道攻击

    = Rs),如果发送方和接收方执行相反方向的加载,则永远不会发生争用。例如,如果接收方的负载从“左”到“右”(Rc 的负载从“右”到“左”(Sc > Ss),则没有争用,反之亦然。...这是因为环互联上的负载流量仅通过之间的最短路径传输内核的环挡和切片的环挡。如果发送方的段与接收方的段不重叠,则接收方将能够使用其段上的全部总线带宽。通过环互连的非重叠段的环流量不会引起争用。...首先,如果接收方的流量包含环互联的发送方流量(即 Rc 则接收方不会看到任何争用。...该策略确保环上的流量永远不会被阻塞,但它可能会延迟其他代理注入新流量,因为环上已有的数据包优先于新数据包。...在前一种情况下,看到如果接收方流和发送方流的目标环代理在同一个集群中,则它们共享信道。在后一种情况下(仅在这种情况下发生),观察到如果两个流的目标环代理位于不同的集群中,则它们共享信道。

    28620

    一文搞懂Go语言内存模型

    如果同步类读内存操作 r 观察到同步类写存储器操作 w(即,如果 W(r) = w),则 w 在 r 之前同步。非正式地,同步前关系是上一段中提到的隐含总顺序的子集,仅限于 W 直接观察到的信息。...如果原子操作 B 观察到原子操作 A 的效果,则 A 在 B 之前同步。在程序中执行的所有原子操作的行为都像是按某种顺序一致的顺序执行的。...= nil; e = e.next {n++}i := *p*q = 1如果 list 指向一个循环列表,那么原始程序将永远不会访问 *p 或 *q,但重写的程序会。...例如,编译器不得在此程序中函数调用之前移动对 *p 或 *q 的访问(至少在不直接了解 f 的精确行为的情况下不能移动):f()i := *p*q = 1如果调用从未返回,则原始程序将再次永远不会访问...如果调用包含同步操作,则原始程序可以在访问 *p 和 *q 之前的边之前建立,但重写的程序不会。不允许单次读取观察多个值意味着不从共享内存中重新加载局部变量。

    43310

    Kotlin上的反应式流-SharedFlow和StateFlow

    事件流已经成为Android的标准配置。多年来,RxJava一直是反应式流的标准。现在,Kotlin提供了自己的反应式流实现,称为Flow。...注意这里使用的术语是「订阅者」,而不是像你在普通Flow中看到的「收集者」。这种命名上的变化,主要是因为SharedFlow永远不会完成。...尽管这也意味着对SharedFlow的Flow.collect()的调用不会正常完成,但订阅仍然可以被取消。正如你所期望的,这种取消是通过取消coroutine发生的。...因为tryEmit(value: T)不会暂停,如果你用默认的replay和extraBufferCapacity值来使用它,它就不会工作。...该库提供了一个扩展方法asLiveData(),允许你转换Flow并将其作为LiveData公开,以便在你的视图中使用。

    2.3K60

    实时流式计算系统中的几个陷阱

    在理想世界中,E == P,但这在任何地方都不会发生。...由于以下原因,数据可能会延迟: kafka上的高负载 生产者在其服务器中缓冲数据 由于应用程序中的背压,消耗速度慢 假设数据将永远不会延迟是一个巨大陷阱。开发人员应始终具有测量数据延迟的工具。...这与以前相同,但是现在您在数据流1和2中都具有不规则的延迟,并且没有固定的模式将其值设为1。 Key D —值D到达,但是没有观察到值D'。考虑以下- 您要等多久才能获得价值D`?...可以使用文件读取器或Kafka中的其他流以状态填充该配置。 在流处理世界中,针对每个事件进行数据库调用可能会使您的应用程序变慢并导致背压。...选择是使用快速数据库,还是通过在应用程序内部存储状态来消除网络调用。 您的配置有多大? 如果配置很大,则仅当配置可以拆分到多个服务器时才应使用应用程序内状态,例如,一个配置为每个用户保留一些阈值。

    1.3K30

    实时流式计算系统中的几个陷阱

    在理想世界中,E == P,但这在任何地方都不会发生。...由于以下原因,数据可能会延迟: kafka上的高负载 生产者在其服务器中缓冲数据 由于应用程序中的背压,消耗速度慢 假设数据将永远不会延迟是一个巨大陷阱。开发人员应始终具有测量数据延迟的工具。...这与以前相同,但是现在您在数据流1和2中都具有不规则的延迟,并且没有固定的模式将其值设为1。 Key D —值D到达,但是没有观察到值D'。考虑以下- 您要等多久才能获得价值D`?...可以使用文件读取器或Kafka中的其他流以状态填充该配置。 在流处理世界中,针对每个事件进行数据库调用可能会使您的应用程序变慢并导致背压。...选择是使用快速数据库,还是通过在应用程序内部存储状态来消除网络调用。 您的配置有多大? 如果配置很大,则仅当配置可以拆分到多个服务器时才应使用应用程序内状态,例如,一个配置为每个用户保留一些阈值。

    1.5K40

    ArkTS-AppStorage应用全局的UI状态存储

    @StorageProp(key)是和AppStorage中key对应的属性建立单向数据同步,我们允许本地改变的发生,但是对于@StorageProp,本地的修改永远不会同步回AppStorage中,相反...被装饰变量的初始值 必须指定,如果AppStorage实例中不存在属性,则作为初始化默认值,并存入AppStorage中。...框架行为 当@StorageProp(key)装饰的数值改变被观察到时,修改不会被同步回AppStorage对应属性键值key的属性中。...被装饰变量的初始值 必须制定,如果AppStorage实例中不存在属性,则座位初始化默认值,并存入AppStorage中。 变量的传递/访问规则说明 传递/访问 说明 从父节点初始化和更新 禁止。...如果在AppStorage中已经创建属性后,再调用Environment.EnvProp()创建同名的属性,会调用失败。

    63010

    强对抗的SquidLoader针对中国企业发起攻击

    文件的元数据中也是如此,想让受害者相信恶意文件只是这些软件的合法组件。当然,这些代码永远不会被执行。...用 IDA 查看 14000770E+2 处无法得到正确的汇编输出。 调用跳转 该地址被 IDA 认为在不同函数中间,140007710 甚至不会出现。...原始返回地址 实际返回地址 控制流图混淆 Shellcode 函数还使用了控制流图混淆,在无限循环中包含大量 Switch 语句。Switch 语句由变量进行控制,看似随机的值来选择下面要执行的分支。...控制流图混淆如下所示: 控制流图混淆 调试器检测 Loader 使用了三种方法检测调试器,一旦发现就会执行非法指令触发崩溃。 检查已知调试器进程名称列表。...如果 C&C 服务器没有响应或者不是预期响应,Payload 就会无限循环 ping C&C 服务器。

    13710

    java io 试题_Java IO流面试题

    与其他输出流不同,PrintStream 永远不会抛出 IOException;而是,异常情况仅设置可通过 checkError 方法测试的内部标志 另外,为了自动刷新,可以创建一个 PrintStream...通过write()方法可以将获取到的字符输出,然后通过newLine()进行换行操作。BufferedWriter中的字符流必须通过调用flush方法才能将其刷出去。...如果要对字节流操作,则使用BufferedInputStream。...PrintWriter的println方法自动添加换行,不会抛异常,若关心异常,需要调用checkError方法看是否有异常发生,PrintWriter构造方法可指定参数,实现自动刷新缓存(autoflush...如果要让某个对象支持序列化机制,则必须让它的类是可序列化的,为了让某个类是可序列化的,该类必须实现Serializable接口或Externalizable接口 发布者:全栈程序员栈长,转载请注明出处:

    43130

    Byteman 使用指南(四)

    注意,位置 AT WRITE 0 或等效位置 AT WRITE this 永远不会匹配任何候选触发方法,因为实例方法调用的目标对象永远不会被分配。...这不是为了处理规则执行引擎检测到的错误(它们应该全部被内部捕获和处理)。异常是从执行引擎抛出的,以改变触发方法的控制流。通常,在从触发调用返回后,触发线程继续执行原始方法代码。...这避免了触发方法主体中剩余代码的正常执行。如果触发点还有其它触发调用待处理,则这些也会被绕过。...因此,指定接口名称的位置永远不会匹配。 如果包含一对或多对大括号,则注入仅限于方法中创建具有相同维数的数组的点。...AT EXCEPTION EXIT 异常退出 AT EXCEPTION EXIT 说明符标识方法通过未处理的异常控制流将控制返回给其调用者的点。

    6710
    领券