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

为什么我的ViewModel在安卓中替换了当前的fragment后还活着?

在安卓中,ViewModel的生命周期与Activity或Fragment的生命周期是独立的。当你替换当前的Fragment时,旧的Fragment会被销毁,但ViewModel并不会随之销毁,它会继续存在于内存中。

这是因为ViewModel的设计初衷是为了存储和管理与UI相关的数据,以便在配置变化(如屏幕旋转)或组件重建(如Fragment的销毁和重新创建)时保留数据状态。ViewModel使用了与Activity或Fragment不同的生命周期,它的生命周期更长,直到关联的Activity或Fragment被销毁。

这种设计有以下优势:

  1. 数据的持久性:ViewModel可以存储和管理与UI相关的数据,确保数据在配置变化或组件重建时不会丢失。
  2. 分离关注点:ViewModel将数据与UI逻辑分离,使得UI组件更加专注于展示数据和响应用户交互,提高了代码的可维护性和可测试性。
  3. 共享数据:ViewModel可以在多个Fragment之间共享数据,使得数据共享更加方便。

在安卓开发中,你可以使用ViewModel来解决数据持久性和UI状态管理的问题。对于替换Fragment后ViewModel仍然存在的情况,你可以通过在Fragment中使用ViewModelProvider来获取ViewModel的实例,并在需要时进行数据的读取和更新。

腾讯云提供了云原生应用开发的解决方案,其中包括云原生应用开发平台Tencent CloudBase、云原生容器服务Tencent Kubernetes Engine(TKE)等产品,可以帮助开发者快速构建和部署云原生应用。你可以参考以下链接了解更多信息:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android--Hilt入门

谷歌接管Dagger,推出了自己Hilt框架,Hilt基于Dagger做了一层封装,大大简化了Dagger使用,定制一系列规范,并支持Jetpack中部分组件,是一个专门为开发DI框架 一...Component,并且我们不必再定义组件,Hilt预定义我们移动开发中所需组件和子组件 这边指定其装载到SingletonComponent,也就是全局APP,旧版本ApplicationComponent..., @Named("wang") var userInfo2: UserInfo2 ) : ViewModel() 最后Activity打印结果 Log.i("aruba_log", viewModel.userInfo2...替换成自定义注解运行 @HiltViewModel class UserViewModel @Inject constructor( var userInfo: UserInfo,...R.layout.activity_view_model) callback.onSuccess() } } 日志结果: I/aruba_log: onSuccess 五、默认绑定 Hilt定义组件都绑定上下文相关对象

1.4K20

Jetpack--LifeCycle、ViewModel、LiveData

Jetpack是google官方开发工具集,目的是为了标准化和加快开发效率,并且之后会持续更新 开发,google推荐使用MVVM架构,Jetpack集成了构建MVVM架构几种工具,相比于以前...可以说你项目没有升级使用这套架构,那么你架构就已经过时 JetPack与AndroidX AndroidX命名空间中包含Jetpack库 AndroidX代替Android Support Library...,降低了模块耦合度,一定程度上避免了没有及时销毁资源情况,降低了内存泄漏发生 二、ViewModel Jetpack,官方提供ViewModel组件,我们应该继承它实现我们ViewModel...还具有异步调用不会造成内存泄漏优点,需要结合LiveData使用,ViewModel生命周期是独立于Activity 三、LiveData LiveData对象提供可观测方法,当数据发送改变时...ViewModel进度值观察,注意这边获取ViewModel时Owner要用Activity上下文,因为实现联动需要使用同一个ViewModel,不同Owner会生成不同实例 package

1.6K20

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

这是如何开发以太坊()钱包系列第3篇, 钱包账号资产信息展示,展示信息主要包括账号地址、eth余额及该账号所拥有的Token及余额。...我们使用了GoogleI/O大会推出一套遵循MVVM开发模式LiveData和ViewModel组件架构。...ViewModel 和 LiveData ViewModel 会关注UI生命周期来存储和管理数据,Activity发生变化(锁屏开屏、旋转)时,ViewModel 会自动保留之前数据并给新Activity...或Fragment使用,当界面被系统销毁时,ViewModel也会进行资源清理,避免内存泄漏。...显示当前账号 可以分为两个步骤: •从数据库读取账号;•界面显示账号 TokensViewModel定义一个MutableLiveData defaultWallet ,从数据库读取账号会保存在

1.2K30

改造 Android 官方架构组件 ViewModel

浅析官方架构组件 用法就不多说了, 此类文章和 Demo 太多了, 明白它们功能和应用场景, 我们才知道它们是否真的适合自己需求, 而不是盲目跟风, 下面就来分析下是如何考察新技术, 以及如何判断这些新技术是否有必要应用到自己项目中...于是认真的研究其源码, 准备通过修改源码并封装成库方式, 让更多开发者更多场景下能够使用到这些功能 改造 ViewModel 组件 要想改造 ViewModel 组件 自然要对它整个源码分析一遍...) 是 Fragment 一个方法, 想很多人应该都知道这个方法意义 简单来说将这个方法设置为 true 就可以使当前 Fragment Activity 重建时存活下来, 如果不设置或者设置为...数据幸免于 Activity 重建, 所以不要在此方法获取 ViewModel Activity onDestroy 方法不能获取 ViewModel, 会报错 通过 Fragment... Fragment onDestroy 方法不能获取 ViewModel, 会报错 ---- Hello 叫Jessyan,如果您喜欢文章,可以以下平台关注 GitHub: https

73610

第四夜 概念漫游(下)

第三夜 概念漫游(上)介绍最基本功能单元和Intent连接方式。在这个骨架之上,我们可以进一步增加一些与开发密切相关重要概念。...视图树 设计,我们往往要给View元素增加各种属性,以控制它们文字、尺寸、大小、颜色等信息。对于ViewGroup来说,它有多个子类,代表不同布局方式。...有Fragment之后,程序员可以根据Activity的当前状况,来选择所包含视图树,比如在手机屏幕显示一个Fragment,而在平板上显示两个Fragment。...Resource 开发,有可能需要一些静态资源,比如图片、字符串、XML文件等等。这些资源被存储项目res/下不同文件夹。 ? 不同资源分类存放。...drawable*文件夹包含不同清晰度图片,而字符串存放在values下strings.xml项目中,我们可以用ID或文件名,来引用对应资源。

1K100

十六年全栈开发者 Android 开发踩坑实录

“应用限制”里选择应用,点击“+”添加软件包名称到需要添加限制 API 密钥下即可。至于添加证书指纹,可以直接复制页面命令,按照网页右侧指示,只需要几分钟就可以完成。...内部 API 版本控制 当我还在主攻 web 开发时,一直都搞不太明白为什么有人会想这么做。更新前端代码为什么还要留着旧版本 API?怎么想都是无用浪费。...一些情境下,开发 Activity 可以被看做是 app 某块屏幕代码; 3.0 才有的 Fragments 则可以被理解子视图代码或是 app 部分代码。...这样,通过点击底边栏按钮,我们就可以把 fragment 加载到 Activity 中了。 所以,为了 app 添加底部导航栏,试图将 Activity 转换为 fragment。...这只是份不完全清单…… 当然,开始你第一份应用时,还有很多其他事情需要考虑,比如添加单元测试、确定一个 app 模式不要更改等等。

1K40

Flutter Android 端 ActivityFragment 流程源码分析

工程结构及 API 变更 对于一个纯 flutter app 来说,当我们 yaml 依赖添加两个 flutter plugin 依赖,然后铜过 Android Studio 导入工程可以看到如下结构...: [在这里插入图片描述] gradle sync 对应依赖如下: [在这里插入图片描述] 可以看到,上面依赖就是我们《Flutter Android 工程结构及应用层编译源码深入分析》一文中分析...调用Activity 5.0以上reportFullyDrawn()官方方法。...//步骤24、判断是否dart已经运行。 //这个情况只会发生在config change我们没有保留Fragment实例场景,尽量不要这样。...,相信你通过上面分析对 Flutter App 承载有一定认识,通常一个 engine 整个 Flutter Dart 无论页面栈多少级,终归端都是一个 Activity 或者 Fragment

1.1K00

【译】LiveData三连

When and why to use Android LiveData 差不多一年前(2017年5月第一个alpha版本),谷歌发布 "架构组件",这是一个库集合,旨在帮助开发人员设计更强大...希望你能从这篇文章获得一些关于LiveData知识,了解它在哪些情况下可以提供帮助,如何使用它,以及为什么它可能是一个比其他现有方法更好解决方案。有其他想法吗?有更好解决方案吗?...When to load data in ViewModels 最近,对一个表面上很简单问题进行了出乎意料长时间讨论。我们代码,我们究竟应该在哪里触发ViewModel数据加载。...尽管如此,仍然有一些问题,我们在这里讨论加载ViewModel数据和评估各种选项问题。 根据我经验,推荐LazyMap方法,因为发现它很好地平衡优点和缺点,而且真的很容易采用。...这篇文章灵感来自于18年开发峰会上一个演讲,觉得这个演讲很新颖,很有趣。 1. You have backpressure in your app.

1.6K20

由浅入深,聊聊 LeakCanary 那些事

---FragmentAndViewModelWatcher用于监听 FragmentViewModel 观察者,具体源码如下:图片上述逻辑,我们可以发现,对于 Fragment 可达性监听方案...需要注意是, invoke() 与 onFragmentCreated() 方法,内部还对 ViewModel 进行了可达性追踪,这也是支持追踪ViewModel 内存泄漏逻辑所在 。...需要注意是,这里初始化 KeyedWeakReference 时,构造函数传入了 queue ,而这样目的是为了 再进行一遍对象是否回收check 。...然后将创建好弱引用观察对象添加到我们观察Map,并使用 Handler 延迟5s 再去检测该对象是否真的被回收。初始化 KeyedWeakReference ,为什么要传入队列 queue ?...需要注意是,该方法内部GC延迟了100ms ,从而以便使得虚拟机真的 GC ,从而将弱引用移动到我们传递引用队列中去。

38840

6.0申请多个动态权限

记一次6.0动态权限获取步骤,多个权限一次申请,便于记忆与以后查看 说来惭愧,最近在测试一个客户端文件上传功能;一直拿模拟器做调试,对接成功,文件上传没问题,相安无事;刚好自己用机...,就直接打包发到真机调试了,文件竟然一直上传不到服务器后面用了旧手机发现又能够上传成功,结果被直接蠢哭;一个是8.0,一个是5.0。...配置文件AndroidManifest.xml配置还需代码动态申请,以下是需要单独申请权限,共分为9组,每组只要有一个权限申请成功,就默认整组权限都可以使用了。 ?...运行时权限特殊处理 1.Fragment申请权限,不要使用ActivityCompat.requestPermissions, 直接使用FragmentrequestPermissions方法...,否则会回调到ActivityonRequestPermissionsResult 2.如果在Fragment嵌套FragmentFragment中使用requestPermissions方法

1.6K20

用代码手把手教你使用MVVM

MVC、MVP简介 MVC、MVP和MVVM都是开发中经常使用模式,我们认识MVVM之前先回顾一下MVC和MVP。...MVVM模式,将程序结构分为三层——View-ViewModel-Model,接下来我们一起来认识它们: View: View层负责和UI相关工作,我们只XML、Activity和Fragment...这里呢,使用是自己封装过Retrofit+RxJava网络请求库,上面的Model用来进行新闻实体类News网络请求; 也定义一个CallBack接口:此回调可以让接下ViewModel获得...包名.类名 name为type实体类定义“名字”,供以下布局中使用 定义data属性,就相当于xml布局已和实体类绑定 控件引用实体类属性格式为: @{实体类.属性名} 控件引用实体类方法格式为...当事件触发时,Model进行网络请求,回调更新实体类,便可对应更新UI界面。 总结 实例只是一个简单功能展示,大家熟悉MVVM可再深度封装。

1.9K20

Android 面试题:为什么 Activity 都重建了 ViewModel 存在?—— Jetpack 系列(3)

ViewModel 作用可以区分 2 个维度来理解: 1、界面控制器维度: 最初 MVC 模式,Activity / Fragment 承担职责过重,因此,在后续 UI 开发模式,我们选择将...Activity / Fragment 与视图无关职责抽离出来, MVP 模式叫作 Presenter, MVVM 模式叫作 ViewModel。...数据,其中包含 ViewModelStore 实例,而这一份数据会临时存储在当前 Activity ActivityClientRecord(属于当前进程,下文说明); 阶段 2: 新 Activity...对于 ViewModel 来说,相当于旧 Activity 中所有的 ViewModel 映射表被透明地传递到重建 Activity ,这就实现恢复 ViewModel 功能。...没有调用 getViewModelStore(),那么旧 Activity ViewModel 并没有被取出来, // 因此准备再一次存储当前 Activity 时,需要检查一下旧

1.1K20

Jetpack源码解析---Navigation为什么切换Fragment会重绘?

上篇文章我们简单介绍Navigation组件使用,以及深入分析源码具体实现,基本原理我们已经很清晰。...但是使用时候发现,当一个Fragment布局稍微复杂一些,切换Fragment时候会顿卡,而且如果再配合DrawrLayout使用的话,还会闪一下屏,效果体验不是很好,本着这个问题,又再次对...按照我们目前开发来说,Fragment切换通常都会使用hide()、show(),而replcae()方式很少用,替换会把容器所有内容全都替换掉,有一些app会使用这样做法,保持只有一个fragment...对于这个问题其实根据上面的分析,也能大概想到是因为什么,但是返回按钮操作之前真没有看过源码,所以这次顺便了解一下: 3....,即便是切换Fragmengt也不会有很明显的卡顿现象,因为每个Fragment即便重新绘制,但是View所对应ViewModel还在,数据并不需要重新加载或者请求,当然这仅仅是自己看法啊.

2.2K40

漫谈Android组件化及Web化

Dex是编译产物,Java会被编译成class,则对这些class文件进行压缩处理得到一个Dex。资源比较多,有图片、布局文件、动画等。...前面提到过插件化要解决其中一个问题就是Dex加载。Java可以通过ClassLoader加载class文件,方面则提供BaseDexClassLoader。...而组件化也存在着问题,最新发布Android P版本限制对私有API访问,一旦访问私有API 应用就会崩溃。...Android提供一种布局容器——Fragment,Activity可以承载很多Fragment,通过切换Fragment也可以达到页面切换效果。这就是Android Nativeweb化。...Context替换指的是将FragmentContext替换成我们自定义Context。

1.1K50

年终总结:疫情被裁—进外包裸辞—大厂高级Android工程师,这一年学习之路

今天这篇文章就是想跟大家分享这一年真实经历,就在前两个月已经是某大厂高级 Android 工程师。...现在已经入职某大厂,刚忙完双十一活动,开启人生新篇章。...十一、Android 核心 Binder 多进 程 AIDL 常见 IPC 机制以及使用场景 为什么要用 binder 进行跨进程传输 多进程带来问题 ............image.png 除了上面的学习路线,还给大家整理了一份Android进阶学习资料,主要为相关知识点及面试资料为主,在这个PDF,通过详解各大互联网公司 Android 常见面试题为主线,从面试角度带你介绍必备知识点...无论是你短期内想提升 Android 内功实力,突破自己工作能力瓶颈,还是准备参加 Android 面试,都会在这个PDF中有所收获。一些基础不好,这里也有一份基础资料包,帮助巩固基础。

92620

“终于懂了“系列:Jetpack AAC完整解析(四)MVVM - Android架构探索!

这篇,就来探索下目前android开发 最优秀、讨论最多架构模式—— MVVM 。 几个月前,所在项目完成了 MVVM 架构改造。这篇开始写之前,也阅读了大量MVVM文章。...但在Android,因为xml布局能力很弱,View很多操作是Activity/Fragment,而业务逻辑同样也是写在Activity/Fragment。 ?...不仅通过数据驱动完成彻底解耦,兼顾 Android 页面开发其他不可预期错误,例如Lifecycle 能在妥善处理 页面生命周期 避免view空指针问题,ViewModel使得UI发生重建时 无需重新向后台请求数据...UserListViewModel 会在配置更改自动恢复,所以一旦创建新 Activity,它就会接收相同 ViewModel 实例,并且会立即使用当前数据调用回调。...Presener 替换ViewModel实现,获取数据以 LivaData呈现。

1.9K10

由浅入深,聊聊 LeakCanary 那些事

FragmentAndViewModelWatcher 用于监听 FragmentViewModel 观察者,具体源码如下: 上述逻辑,我们可以发现,对于 Fragment 可达性监听方案...需要注意是, invoke() 与 onFragmentCreated() 方法,内部还对 ViewModel 进行了可达性追踪,这也是支持追踪ViewModel 内存泄漏逻辑所在 。... install() 时,会通过反射方式取出 ActivityThread mH(Handler),并使用自定义 CallBack 替换 Handler 中原来 mCallBack ,并缓存原来...需要注意是,这里初始化 KeyedWeakReference 时,构造函数传入了 queue ,而这样目的是为了 再进行一遍对象是否回收check 。...需要注意是,该方法内部GC延迟了100ms ,从而以便使得虚拟机真的 GC ,从而将弱引用移动到我们传递引用队列中去。

31020
领券