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

LiveData 还有学习的必要吗?—— Jetpack 系列(2)

: 当宿主生命周期进入消亡(DESTROYED)状态LiveData 会自动移除观察者,避免内存泄漏; 2、安全地回数据: 宿主生命周期状态低于活跃状态(STAETED)LiveData 不会回数据...Kotlin Flow 拥有比 LiveData 丰富的能力,但裁剪了 RxJava 大量复杂的操作符,做得更加精简。...源码的 Observer#mLastVersion 和 LiveData#mVersion 子类重新实现一遍。...---- 参考资料 LiveData 概览[12] —— 官方文档 重学:吃透 LiveData 本质,享用可靠消息鉴权机制[13] —— KunMinX 著 重学LiveData 数据倒灌...:吃透 LiveData 本质,享用可靠消息鉴权机制: https://xiaozhuanlan.com/topic/6017825943 [14] 重学LiveData 数据倒灌 “背景缘由全貌

3.5K10

【译】LiveData三连

When and why to use Android LiveData 差不多一年前(2017年5月的第一个alpha版本),谷歌发布了 "架构组件",这是一个库的集合,旨在帮助开发人员设计更强大...后来,当你需要处理数据并在此基础上改变UI,你会发现继续活动写代码,这样会容易,因为它已经包含了所有需要更新的字段和UI元素。让我们来看看代码会是什么样子。...这就是LiveData的神奇之处。视图模型返回LiveData,它是一个可观察的类,从而使我们的Activity成为观察者。就像基于事件的解决方案一样,当数据被改变,我们会相应地改变用户界面。...我们的例子视图模型从UserRepository类获得其返回值,该类保留了一个LiveData的实例,该实例包裹着一个数据持有者FollowStatus。...当用户点击Follow/Unfollow按钮,代码会调用视图模型的toggleFollowing方法,这又会调用UserRepository。

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

有小伙伴说看不懂 LiveData、Flow、Channel,跟我走

Kotlin Flow 拥有比 LiveData 丰富的能力,但裁剪了 RxJava 大量复杂的操作符,做得更加精简。...setValue 相同的值,订阅者会收到多次 onChanged() 回(可以使用 distinctUntilChanged() 解决,此处展开); LiveData 不支持背压: 在数据生产速度...如果有多个 flowOn 运算符,每个 flowOn 只会更改当前位置的上游数据流; 状态回 onStart: 在数据开始发送之前触发,在数据生产线程回; 状态回 onCompletion: 在数据发送结束之后触发...,在数据生产线程回; 状态回 onEmpty: 在数据流为空触发(在数据发送结束但事实上没有发送任何数据),在数据生产线程回。...可以看到,这些协程 API 只有最后组件 / 视图销毁才会取消协程,当视图进入后台协程并不会被取消,Flow 会持续生产数据,并且会触发更新视图

2.1K10

如何正确的 Android 上使用协程 ?

今年的 Google IO 也放出了 Kotlin First 的口号,许多新的 API 和功能特性将优先提供 Kotlin 支持。所以,时至今日,实在找不到开发者不学 Kotlin 的理由了。... Android ,一般是建议直接使用 GlobalScope 的。那么, Android 应该如何正确使用协程呢?再细分一点,如何直接在 Activity 中使用呢?...LiveData Kotlin 同样为 LiveData 赋予了直接使用协程的能力。...当 LiveData 进入 active 状态liveData{ } 会自动执行。当 LiveData 进入 inactive 状态,经过一个可配置的 timeout 之后会自动取消。...所以 livedata-ktx 的使用是有一定限制的。对于需要用户主动刷新的场景,就无法满足了。一次完整的生命周期内,一旦成功执行完成一次,就没有办法再触发了。

2.7K30

【Jetpack】Room + ViewModel + LiveData 综合使用 ( 核心要点说明 | 组合方式 | 代码示例 )

视图模型层 : 该层 不与 Room 和 Retrofit 直接交互 , 而是与 Repository 层 进行交互 ; ViewModel 层引入 LiveData 监听数据变化 , 如果数据发生变化则在...LiveData 设置的 androidx.lifecycle.Observer 监听器回 更新 View 视图 ; View 视图层 : Activity / Fragment 负责视图显示的...ViewModel 使用要点 Activity 组件 , 通过调用 ViewModel 视图模型获取 数据库的数据 , ViewModel 调用 Repository 层的增删改查方法 , Repository...通过调用 ViewModel 视图模型 , 访问 Room 数据库框架 , 对数据进行增删改查 , 并通过 LiveData 监听数据库的数据 , 如果数据库的数据发生改变 , 自动回 LiveData...18), Student(id=2, name='Jerry', age=16)] ; 更新数据 S2 , 数据库数据发生改变 , 自动触发 Observer#onChanged 回 , 此时数据库中有数据

61820

生命周期感知 Lifecycle

这样的话 MyLocationListener 类就可以自给自足,自己本身内部实现响应生命周期变化的逻辑处理。...例如,如果回调在保存活动状态后运行 Fragment 事务,那么它将触发崩溃,因此我们永远都不想调用该回。 为了简化此用例,Lifecycle 类允许其他对象查询当前状态。...让 ViewModel 去获取数据,数据更改通过 LiveData 响应到视图。...还可以使用可识别生命周期的组件应用程序销毁终止缓冲。 启动和停止网络连接。 使用可感知生命周期的组件可以应用程序处于前台状态实时更新(流式传输)网络数据,并在应用程序进入后台自动暂停。...这不太可能影响你的代码,但是需要注意这一点,因为它与 API 级别 26 及更低级别的 Activity 类的调用顺序匹配。 参考资料 Lifecycle(使用篇)

1.2K20

Google 推荐 MVVM 架构中使用 Kotlin Flow

Google Android 团队宣布了 Jetpack 的视图模型之后,它已经成为了现代 Android 开发模式最流行的架构之一,如下图所示: ?...官宣 Jetpack 的视图模型之后,同时 Google [Jetpack Guide](https://developer.android.com/jetpack/guide#fetch-data...协程的扩展,让我们可以像运行同步代码一样运行异步代码,使得代码更加简洁,提高了代码的可读性 易于做单元测试 Kotlin Flow 如何在 MVVM 中使用 Jetpack 的视图模型 MVVM 架构由...Kotlin Flow Repositories 的使用 如果我们想在 Flow 中使用 Retrofit 或者 Room 进行网络请求或者查询数据库的操作,我们需要将使用 suspend 修饰符的操作放到...flow { ... } 和 liveData{ ... } 内部都有一个 emit() 方法。

4.1K20

【Jetpack】ViewModel + LiveData + DataBinding 综合使用 ( 核心要点说明 | 组合方式 | 代码示例 )

DataBinding 结合使用时 , DataBinding 布局设置的就是该 视图模型 类对象 ; 该 ViewModel 类 , 还 使用了 LiveData , 可以实时监听数据改变..., 可以将 运行过程 ViewModel 的 Model 模型数据改变 通知 视图 View , 令视图组件显示最新的数据内容 ; ViewModel 中使用了 LiveData 后 , 必须调用...androidx.lifecycle.Observer#onChanged 函数 , 该回函数执行 更新视图 操作 ; LiveData 使用核心要点 : 首先 , 自定义 ViewModel...androidx.lifecycle.Observer 监听器 , 当数据发生改变 , 就会 回 监听器的 androidx.lifecycle.Observer#onChanged 回函数 ;...DataBinding 配置 ViewModel 视图模型对象 ; TextView 显示文本 , 设置如下属性 , 由于显示的内容是 Int 数字 , 需要转为 String 后才能显示 ;

1.3K20

Android面试大纲(集合)

主线程执行 doInBackground():执行异步任务,在线程池中执行 onProgressUpdate():当doInBackground调用publishProgress主线程执行...onPostExecute():异步任务执行之后回主线程执行 onCancelled():异步任务被取消 3、AsyncTask工作原理 Android进阶——多线程系列之异步任务AsyncTask...是存放在堆的,我们只要回收堆内存即可 3.0以后Bitmap是存放在内存的,我们需要回收native层和Java层的内存 官方建议我们3.0以后使用recycle方法进行回收,该方法也可以主动调用...本地缓存 内存缓存 16 UI卡顿面试题 1、UI卡顿原理 View的绘制帧数保持60fps是最佳,这要求每帧的绘制时间超过16ms(1000/60),如果不能在16ms内完成界面的渲染,那么就会出现卡顿现象...,使CPU和GPU负载过重 View频繁的触发measure、layout,导致measure、layout累计耗时过多和整个View频繁的重新渲染 频繁的触发GC操作导致线程暂停,会使得安系统16ms

1.1K20

由浅入深,详解 LiveData 的那些事

的状态更新方法,从而触发了数据分发。...先说说 Flow ,其指的是 Kotlin 的数据流,虽然功能上不如Rx强大,但在 Kotlin 的背景下,其无疑是最佳搭档,毕竟有协程这个好兄弟,因此,Android团队建议使用 Flow 替换...说的详细点: 2017年,Kotlin 的占有率可没那么高,所以 LiveData 作为 AAC 的重要组件自然承担了大部分责任。...而在2022的今天,Kotlin Android开发的占有率早已经超过63%(这只是2021年统计),随着日益增加的业务与架构挑战,LiveData 显然不能满足更多需求,架构也需要先进的组件支持...相比 LiveData ,Flow 就显得更加强大,不仅独立于具体的视图层,而且其可以单独的集成到业务模块。功能上,支持数据的各种处理,搭配协程,是 Kotlin 背景下不可获取的利刃。

1.3K20

【译】LiveData with Coroutines and Flow

这意味着没有中断,也不需要在重新创建视图进行清理。 撇开命名不谈,有两种机制可以将数据从ViewModel/Presenter发送到View。 拥有对视图的引用并直接调用它。...如果我们ViewModel中有一个对Activity的引用,我们将需要确保。 当视图被销毁清除它 如果视图处于transitional状态,避免访问。...操作是你应用需要做的任何事情,比如从网络上获取数据、过滤结果或计算一些文本的排列。 对于你创建的任何操作,你需要考虑其范围:从启动到取消的时间范围。让我们看两个例子。...现在,更好的方法是使用Kotlin的Flow(警告:有些部分仍在试验)。...在这个例子,我们使用的API让我们设置了一个完成的监听器和一个失败的监听器,所以它们的回,当我们收到数据或错误时,我们会调用continuation.resume或continuation.resumeWithException

1.4K10

ViewModels and LiveData- Patterns + AntiPatterns

✅将Activity和Fragment的逻辑保持最低限度 View references in ViewModels 视图模型与Activity或Fragment有不同的作用域。...ViewModel配置变化时被持久化,所以当重新请求发生,不需要重新查询外部数据源(如数据库或网络)。 当长期运行的操作结束,ViewModel的观察变量会被更新。数据是否被观察并不重要。...视图如何区分正在加载的数据、网络错误和一个空列表? 你可以从ViewModel暴露出一个LiveData。例如,MyDataState可以包含关于数据是否正在加载、是否已经成功加载或失败的信息。...LiveData in repositories 为了避免泄露ViewModels和回地狱,可以像这样观察存储库。 img 当ViewModel被清除或视图的生命周期结束,订阅被清除。...当触发器得到更新,该函数被应用,结果被派发到下游。

1.1K30

引入Jetpack架构后,你的App会发生哪些变化?

关于Activity/Fragment其最重要的概念就是生命周期管理,我们开发者需要在不同生命周期回做不同事情。...LiveData + Lifecycle 实现 1 + 1 > 2 LiveDataLifecycle的加持下可以实现只可见状态接收通知,说的通俗一点Activity执行了onStop()后内部LiveData...值,等回到ActivityA 你肯定希望Observer收到多次通知而引发textView多次重绘。...引入Lifecycle后这个问题便可迎刃而解,liveData绑定Lifecycle(例子的this)后,当回到ActivityA只会取liveData最新的值然后做通知,从而避免多余的操作引发的性能问题...关于这个问题我在上篇文章Data Mapper章节描述的很清楚,拿到后端数据转换成本地模型(此过程会编写所有数据相关逻辑),本地模型与设计图一一对应,不但可以将视图与后段隔离,而且可以解决xml编写业务逻辑的问题

1K31

理解协程、LiveData 和 Flow

而在 Presentation 层内部也有进一步的解决方案: 让一个对象可以 Activity 和 Fragment 被销毁、重新创建依然留存,这个对象就是架构组件的 ViewModel 类。...比如通过网络获取一些数据,或者是绘图界面中计算一段曲线的控制锚点,可能所适用的作用域不同。如何取消该操作的时间太晚,可能会浪费很多额外的资源;而如果取消的太早,又会出现频繁重启操作的情况。...实际应用,以我们的 Android Dev Summit 应用为例,里面涉及到的作用域非常多。...ViewModel 模式 当 ViewModel 监听 LiveData,而且没有对数据进行任何转换操作,可以直接将 dataSource LiveData 赋值给 ViewModel 暴露出来的...这时您可以使用 suspendCancellableCoroutine 协程构造方法,这个方法是协程和回之间的适配器,会在内部提供一个 continuation 供开发者使用: suspend fun

2.1K20

Jetpack之LiveData详解

简介 LiveData 是Jetpack的一个组件,是一个可被观察的数据存储器类, 具有感知组件生命周期的能力,LiveData 可以感知组件生命周期活跃状态发送数据更新,组件销毁移除观察者对象,...(如 Activity / Fragment 等实现了LifecycleOwner 接口的对象)处于活跃状态即 STARTED 或 RESUMED 状态就会触发 Observer 的回从而更新 mTextView...他们的作用都是将一个 LiveData 转换为另一个 LiveData 对象,当一个 LiveData 里的值发生改变另一个 LiveData的值也随之发生改变。...LiveData 结合 ViewModel 使用 前面介绍 LiveData 的使用时都是直接在Activity里使用的,但是真实开发场景我们一般直接在 Activity / Fragment 中使用而是...关于 DataBinding 的详细介绍请参考 Jetpack 之 DataBinding 原理 前面介绍了 LiveData 的使用,接下来看看 LiveData 内部是怎么实现只在生命周期活跃状态下回观察者的观察方法的

1.6K20

使用kotlin协程提高app性能(译)

本主题描述了如何使用Kotlin协程解决这些问题,使您能够编写清晰,简洁的应用程序代码。 管理长时间运行的任务 Android上,每个应用程序都有一个主线程来处理用户界面并管理用户交互。...在上面的示例,get()仍然主线程上运行,但它在启动网络请求之前挂起协同程序。当网络请求完成,get恢复暂停的协程,而不是使用回调来通知主线程。...要在主线程之外运行代码,您可以告诉Kotlin协程Default或IO调度程序上执行工作。Kotlin,所有协同程序必须在调度程序运行,即使它们主线程上运行。...协程取消期间触发捕获异常或Throwable的异常处理程序。...仅在另一个协同程序内部或在挂起函数内部执行并行分解才使用异步。

2.3K10

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

项目由MVP过渡到MVVM,其中一个典型的重构手段就是将Presenter的回写法改写成ViewModel持有LiveData由View层订阅,比如以下场景: 大力自习室,当老师切换至互动模式...当然,有一种解法通过保证LiveData同一个值只会触发一次onChanged回,封装了MutableLiveData的SingleLiveEvent。...ViewModel和View层的通信只依赖LiveData足够吗? 使用MVVM架构,数据变化驱动UI更新。...发现问题 DialogFragment和Activity的通信 我们通常使用DialogFragment来实现弹窗,在其宿主Activity设置弹窗的点击事件,如果回函数引用了Activity对象...所以我们建议让Activity实现接口,弹窗每次Attach都会将当前附着的Activity强转成接口对象来设置回方法。

3.2K20
领券