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

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

基于LiveData+ViewModel的MVVM架构某些场景下(以横竖为典型)存在局限性,本文会顺势介绍适合Android开发的基于Flow/Channel的MVI架构。...背景 大力智能客户端团队平板端大力一起学App上深度适配了横竖场景,将原先基于Rxjava的MVP架构重构成基于LiveData+ViewModel+Kotlin协程的MVVM架构。...,比如LiveData防止因Activity停止时消费导致crash 方案一:阻塞队列 ViewModel持有阻塞队列,View层主线程死循环读取队列内容。...也可以使用repeatOnLifecycle(State) 来UI层收集,当生命周期 < State时,会取消协程,恢复时再重新启动协程。...可以选择使用StateFlow/LiveData收敛页面全部状态,也可以拆分成多个。但更加建议按UI组件模块拆分收敛。 跳过使用Intent,直接调用ViewModel方法也可以接受。

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

ViewModel再问—字节真题

之前我们说过一期ViewModel,但是有读者反映还是有些面试题不会回答,今天就节选一些再来看看 : ViewModel怎么实现自动处理生命周期? 为什么旋转屏幕后不会丢失状态?...为什么旋转屏幕后不会丢失状态?为什么ViewModel可以跟随Activity/Fragment的生命周期而又不会造成内存泄漏呢?...而且设置setRetainInstance(true)方法可以保证configchange时的生命周期不被改变,让这个FragmentActivity重建时存活下来。...所以,到这里,第三个问题应该也可以回答了,2.0之前呢,都是通过他们创建了一个空的fragment,然后跟随这个fragment的生命周期。...所以只要使用了 ViewModel,就可以使用 viewModelScope ViewModel 中启动各种协程,而不用担心任务泄漏。

1.7K20

Jetpack组件之ViewModel

首语 对于支持横竖切换的应用程序,我们切换横竖时,Activity会被重新创建,我们需要考虑数据的存储和恢复。...super.onCleared(); } } ViewModel是一个抽象类,只有一个onClear(),当ViewModel与之关联的Activity都被销毁时,该方法就会被调用,方法里可以执行一些资源释放相关的工作...中,每点击一次,计数器+1,ViewModel的实例化是通过ViewModelProvider来完成的,它会判断ViewModel是否存在,若存在直接返回,不存在则创建。...)).get(HomeViewModel.class); 另一个Fragment中同样实例化ViewModel。...是以HashMap的形式缓存起来了,就像之前说的,页面需要ViewModel时,先判断缓存中是否存在,若存在,直接返回,不存在则创建

65710

ViewModel:持久化、onSaveInstanceState()、UI 状态恢复和 Loader

这使 ViewModel 成为搭配 setRetainInstance(true)(实际上,ViewModel 幕后使用了一个 fragment 并将 setRetainInstance 方法中的参数设置为...onSaveInstanceState() 配置更改期间和 activity 进入后台时被调用;在这两种情况下,如果你的数据被保存在 ViewModel 中,实际上并不需要重新加载或者处理他们。...onSaveInstanceState 是用于存储 UI 控制器被系统终止又重建后可以轻松地重新加载 activity 状态时所需的少量数据。...当 activity创建的时候 — 可能出现三种不同的方式: Activity 是第一次被创建:在这种情况下,onSaveInstanceState()方法中的 bundle 里是没有数据的,ViewModel...Activity 配置更改后被创建Activity 会将本次查询保存在 onSaveInstanceState() 的 bundle 参数中并且 ViewModel 也会将搜索结果缓存起来。

3.7K30

ViewModel

一.视图和数据模型之间的桥梁ViewModel   页面(Activity/Fragment)功能较为简单的情况下,通常会把UI交互,与数据获取等相关的业务逻辑全部写在页面中。...如果数据不进行存储,则通常还要去重新获取一次数据。幸运的是,ViewModel可以为我们解决这个问题。...为了验证这一点,我们ViewModel创建一个计时器,每隔1s钟,通过接口OnTimeChangeListener通知它的调用者,并通过这个示例来学习一下ViewModel的使用。   ...,Activity中监听OnTimeChangeListener发来的通知,并据此更新UI界面。...可以看到,当屏幕发生旋转的时候,计时器仍然继续,这意味着横竖下的Activity对应的ViewModel是同一个,它所持有的数据一直存在着。

19130

ViewModel:持久化、onSaveInstanceState()、UI 状态恢复和 Loader

这使 ViewModel 成为搭配 setRetainInstance(true)(实际上,ViewModel 幕后使用了一个 fragment 并将 setRetainInstance 方法中的参数设置为...onSaveInstanceState() 配置更改期间和 activity 进入后台时被调用;在这两种情况下,如果你的数据被保存在 ViewModel 中,实际上并不需要重新加载或者处理他们。...onSaveInstanceState 是用于存储 UI 控制器被系统终止又重建后可以轻松地重新加载 activity 状态时所需的少量数据。...当 activity创建的时候 — 可能出现三种不同的方式: Activity 是第一次被创建:在这种情况下,onSaveInstanceState()方法中的 bundle 里是没有数据的,ViewModel...Activity 配置更改后被创建Activity 会将本次查询保存在 onSaveInstanceState() 的 bundle 参数中并且 ViewModel 也会将搜索结果缓存起来。

92420

“终于懂了“系列:Jetpack AAC完整解析(三)ViewModel 完全掌握!

1.1 出场背景 详细介绍ViewModel前,先来看下背景和问题点。 Activity可能会在某些场景(例如屏幕旋转)销毁和重新创建界面,那么存储在其中的界面相关数据都会丢失。...例如,界面含用户信息列表,因配置更改而重新创建 Activity 后,新 Activity 必须重新请求用户列表,这会造成资源的浪费。能否直接恢复之前的数据呢?...看到因屏幕旋转而重新创建Activity后,ViewModel对象依然会保留。只有Activity真正Finish的时ViewModel才会被清除。...那么很自然的,因系统配置变更Activity销毁重建,ViewModel内部存储的数据 就可供重新创建Activity实例使用了。这就解决了第一个问题。...4、从activity A中启动一个新的activity时。 5、屏幕方向切换时,例如从竖切换到横时。

1.7K10

Jetpack系列——ViewModel

生命周期 当Android应用程序退回到桌面,或者横竖切换时,Activity等组件可能会丢失状态或者是被销毁,这时,开发者通常需要考虑数据的保存和恢复,常见的就是通过onSavaInstanceState...ViewModel独立于组件的配置的变化,也就是说,当发生特殊情况导致Activity重新执行某些生命周期时,ViewModel的生命周期并不会发生变化。...为了证明Activity执行各生命周期时,ViewModel并不会随之变化,所以我们可以ViewModel中使用Handler或者RxJava做一个定时循环任务,观测Activity是否会影响ViewModel...接下来,Activity创建ViewModel实例对象,调用其startHandler()方法开始执行: class ViewModelActivity : AppCompatActivity()...[1240] 上述代码中也介绍了最重要的一个点,那就是ViewModel实例的创建,首先需要创建一个ViewModelProvider类对象,其构造方法中需要传入Activity实例,androidx

57710

Android Jetpack - ViewModel

,都不可避免的会遇到 “转” 问题 ?...好好的数据在你转的瞬间,莫名其妙的消失了 发生以上情况和 Activity 的配置更改有关, 屏幕旋转属于配置更改(Activity 生命周期内自行处理的配置更改)的情况之一,其它类似的还包括接入外置键盘...ViewModel 会从你第一次创建(通常在 onCreate 时)直到此 Activity 完成并销毁,Activity 在生命周期中可能会多次销毁创建 ,但 ViewModel 始终存活 如何使用...和 UI 控制器之间的通信 3、 UI 控制器中使用 ViewModel 1、创建 ViewModel 创建 MainActivityViewModel 并继承 ViewModel class MainActivityViewModel...cm.start() } } 3、 UI 控制器中使用 ViewModel 我们计时开始之前先将系统当前时间存入 viewModel.startTime 变量,而后每次 onCreate 被调用时

83120

Andorid-JetPack-ViewModel组件

1.什么是ViewModel 具备宿主生命周期感知能力的数据存储组件 ViewModel保存的数据,页面因 配置变更导致页面销毁 重建之后依然是存在的 配置变更:横竖切换、分辨率调整、权限变更、系统字体样式变更...复用实现原理 准确点来说,应该是ViewModel如何做到宿主销毁了,还能继续存在.以至于页面恢复重建后,还能接着复用 肯定是前后获取到的是同一个ViewModel实例对象 我们先来看下获取ViewModel...store, @NonNull Factory factory) { mFactory = factory; mViewModelStore = store; } } 创建...答案是ActivityThread中被调用的, **3.4 因配置变更重新启动一个activity,会执行ActivityThread的handleRelaunchActivity()方法,继而调用retainNonConfigurationInstances...; //重新创建一个activity之前要把发生配置变更的activity销毁 if (!

1.7K30

Android MVVM框架搭建(一)ViewModel + LiveData + DataBinding

Android MVVM框架搭建(一)ViewModel + LiveData + DataBinding 前言 正文 一、创建项目 二、ViewModel使用 ① 绑定Activity ② 页面布局绘制...首先创建一个项目,命名为MVVM-Demo。 本文的主要目标是ViewModel 和 DataBinding。   ...① 绑定Activity MVVM的框架中,每一个Activity都应该对应一个ViewModel,而现在我们有一个MainActivity,因此可以新建一个viewmodels包,包下新建一个MainViewModel...因为这个结果是对的,那就是数据持久化,因为我们知道手机切换屏幕的时候Activity是会重新创建的,因此如果我们的数据是放在Activity中,那么切换屏幕之后就会重置,输入框也不会有值,但是通过ViewModel...去保存输入框的值就不同了,虽然你的Activity切换屏幕的时候销毁并且重新创建了,但是我的MainModel依然稳定,所以我才能在横的时候也登陆,这样不会造成数据丢失。

14.2K86

Android MVVM框架搭建(一)ViewModel + LiveData + DataBinding

Android MVVM框架搭建(一)ViewModel + LiveData + DataBinding 前言 正文 一、创建项目 二、ViewModel使用 ① 绑定Activity ② 页面布局绘制...首先创建一个项目,命名为MVVM-Demo。 本文的主要目标是ViewModel 和 DataBinding。   ...① 绑定Activity MVVM的框架中,每一个Activity都应该对应一个ViewModel,而现在我们有一个MainActivity,因此可以新建一个viewmodels包,包下新建一个MainViewModel...因为这个结果是对的,那就是数据持久化,因为我们知道手机切换屏幕的时候Activity是会重新创建的,因此如果我们的数据是放在Activity中,那么切换屏幕之后就会重置,输入框也不会有值,但是通过ViewModel...去保存输入框的值就不同了,虽然你的Activity切换屏幕的时候销毁并且重新创建了,但是我的MainModel依然稳定,所以我才能在横的时候也登陆,这样不会造成数据丢失。

2.2K32

App 组件化模块化之路——Android 框架组件(Android Architecture Components)使用指南

通用的框架准则 官方建议架构 App 的时候遵循以下两个准则: 关注分离 其中早期开发 App 最常见的做法是 Activity 或者 Fragment 中写了大量的逻辑代码,导致 Activity...这样做的好处就是如果系统销毁了应用,这个参数会被保存并且下次重新启动时可以恢复之前的数据。 用户对象数据:POJO 持有用户数据。 我们要创建 ViewModel 对象用于保存以上数据。...ViewModel 是一个框架组件。它为 UI 组件 (fragment或activity) 提供数据,并且可以调用其它组件加载数据或者转发用户指令。...ViewModel 不会关心 UI 长什么样,也不会受到 UI 组件配置改变的影响,例如不会受旋转屏幕后 activity 重新启动的影响。因此它是一个与 UI 组件无关的。...要使用 Room 组件,需要以下步骤: 使用注解 @Entity 定义实体 创建 RoomDatabase 子类 创建数据访问接口(DAO) RoomDatabase 中引用 DAO 用注解 @Entity

1.6K20

Android JetPack~LiveData(二) 数据倒灌问题

页面重建时,LiveData自动推送最后一次数据供我们使用。 官方描述:ViewModel 将数据保留在内存中,这意味着开销要低于从磁盘或网络检索数据。...ViewModel 与一个 Activity(或其他某个生命周期所有者)相关联,配置更改期间保留在内存中,系统会自动将 ViewModel 与发生配置更改后产生的新 Activity 实例相关联。...倒灌原因小结 Activity异常销毁然后重建,ViewModel会保存销毁之前的数据,然后Activity重建完成后进行数据恢复,所以LiveData成员变量中的mVersion会恢复到重建之前的值...但是Activity重建后会调用LiveData的observe()方法,方法内部会重新new一个实例,会将mLastVersion恢复到初始值。...解决办法 再来回顾下,数据倒灌的常见方式: 屏幕旋转 用户手动切换系统语言 方案: 如果应用不需要横,就设置为永久竖

1.7K20

开发以太坊安卓钱包系列3 - 资产信息展示

View 通常对应于Activity/Fragment/自定义View Model:则是和数据相关的模块。...使用MVVM模式最大的优点就是解耦, 因为数据处理逻辑是独立于View, UI更改时,ViewModel 不用做太多改动。...我们使用了GoogleI/O大会推出的一套遵循MVVM开发模式的LiveData和ViewModel组件架构。...ViewModel 和 LiveData ViewModel 会关注UI生命周期来存储和管理数据,Activity发生变化(锁开屏、旋转)时,ViewModel 会自动保留之前的数据并给新的Activity...先对问题做一个拆分,把数据拆分为4个部分: •显示当前选中的账号•显示当前账号 ETH 余额•显示当前账号下 Token 数量•显示对应的法币金额。

1.3K30

Android横下Fragment界面重叠问题

此时,我们测试将activity显示去掉,让他竖显示,然后进行关屏幕,打开屏幕操作,会发现 的情况下,并没有发生界面重叠的问题。...可以看到,Activity又执行了一次onCreate()方法,而Fragment执行了多次onCreateView()   总结一下:锁关闭屏幕后Activity会由横切换为竖,这个时候执行了...Fragment), 解打开屏幕后Activity又有竖切换为横(我们强制设置的横显示),又执行了onCreate()方法,导致又创建了一次Fragment,但是原来的Fragment还是没有被销毁...那么最终就会导致打开屏幕后 之前所有未被销毁的Fragment都显示出来。   ...解决方法:   我们不让开关屏幕的时候Activity走生命周期,那么清单文件中给Activity设置下面这两个属性即可 android:screenOrientation="landscape"

1.6K50

Android基础 | 关于Activity你应该明白的一切

异常情况下的生命周期与处理方式 我们开发中,经常会遇到转的问题,而转一般也会带来 Activity重新创建,所以大多数开发者开发的时候,Activity默认是禁止转的,但是一些短视频软件上,...当Actiivty 被重新创建后,系统会调用 onRestoreInstanceState, 并且吧 Activity 销毁时 onSaveInstanceState 方法保存的 Bundle 对象作为参数同时传递给...Activity的启动模式 为什么Activity需要启动模式呢? 默认情况下,当我们多次启动同一个Activity 时,系统会创建多个实例并把他们按照 后进先出的原则(栈结构) 一一放进任务栈中。...即每次启动一个Activity 都会重新创建一个新的实例,不论这个实例是否存在。相应的生命周期也遵从标准的生命周期过程。 singleTop 栈顶复用模式。...并重新创建

64820
领券