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

重新创建视图后,碎片丢失ViewModel中的数据

是指在Android开发中,当屏幕发生旋转或者配置发生变化时,Activity或Fragment会被销毁并重新创建,导致之前保存在ViewModel中的数据丢失。

为了解决这个问题,可以采取以下几种方法:

  1. 使用ViewModel的SavedState功能:ViewModel的SavedState功能可以在配置变化时保存和恢复数据。通过在ViewModel中使用SavedStateHandle对象,可以将数据保存在Bundle中,并在重新创建视图后从Bundle中恢复数据。
  2. 使用onSaveInstanceState方法:在Activity或Fragment中,可以重写onSaveInstanceState方法,在其中保存需要保留的数据。然后在onCreate方法中的savedInstanceState参数中恢复数据。这种方法适用于保存少量简单的数据,如基本类型或Parcelable对象。
  3. 使用持久化存储:如果需要保存大量的数据或者需要长期保留数据,可以考虑使用持久化存储,如SharedPreferences、数据库或文件存储。在重新创建视图后,从持久化存储中读取数据并恢复。
  4. 使用LiveData:LiveData是一种可观察的数据持有者,可以在数据发生变化时通知观察者。通过将数据存储在ViewModel中的LiveData对象中,可以在重新创建视图后从LiveData中获取最新的数据。这种方法适用于需要实时更新数据的场景。

总结起来,为了避免重新创建视图后碎片丢失ViewModel中的数据,可以使用ViewModel的SavedState功能、onSaveInstanceState方法、持久化存储或LiveData等方法来保存和恢复数据。具体选择哪种方法取决于数据的类型和需求。

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

相关·内容

Solr core 创建数据导入

前言 在笔记1,我们已经介绍了Solr下载及单节点启动和配置,以及如何创建core,但是如何进行数据导入却还没有介绍。...这篇文章就将教你在创建core之后,应该如何进行相关配置并导入数据; 配置数据库 笔记1,在创建core时,有一个solrconfig.xml文件,如下图所示: 打开该文件,并在文件config...--以下dataSource指定上边dataSource标签name属性,并不是必须要加,除非你配置了多个数据源,这里我是一个数据源,所以,下边dataSource属性是可以去掉,另外,pk...> PS: solr有全局索引和增量索引,所以上述配置中有两次query操作; 全局索引:对应上述配置query,即将所有要建立索引数据重新建立一般...数据库,因此需要导入MySQL数据库驱动包,从网上找到驱动包,将其放入solr-xxx/webapps/solr/WEB-INF/lib文件夹

73920

【Jetpack】ViewModel 架构组件 ( 视图 View 和 数据模型 Model | ViewModel 作用 | ViewModel 生命周期 | 代码示例 | 使用注意事项 )

: 瞬态数据丢失 : 操作 Activity 时 , 如果 屏幕 自动旋转 , 当前 Activity 组件会 执行销毁操作 , 并重新创建 Activity 组件 , 该操作会 导致 Activity... 瞬态数据 丢失 ; 内存泄漏 : 在 系统组件 如 Activity , 启动了一个线程 , 在线程执行一系列操作 , 如果 Activity 在线程停止前销毁 , 那么 从 Activity...Model ---- 在 Activity , 存在两种元素 , 视图 View 和 填充视图数据 数据模型 Model ; 如果将 视图数据模型 都写在 Activity , 二者...视图数据模型 之间 保持 通信 ; 这样 Activity 代码量减少了 , 只需要维护 视图 View 相关内容 , 增加了代码可维护性 , 以及可测试性 ; 在 ViewModel 架构...以及 数据模型 Model 销毁 ; Activity 组件 获取数据时 , 不直接从 数据模型 Model 获取 , 而是 从 ViewModel 架构组件获取 ; ViewModel 作用

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

    注意,很多 UI 数据会自动地被保存和恢复: “该方法默认实现保存了关于 activity 视图层次状态临时信息,例如 EditText 控件文本或者 ListView 控件滚动条位置。”...你也不想在你不需要时候重新数据库加载数据。让我们看一个 activity 例子,在这个 activity 你可以搜索你音乐库: ? Activity 未搜索时及搜索状态示例。...Activity 在配置更改创建:Activity 会将本次查询保存在 onSaveInstanceState() bundle 参数并且 ViewModel 也会将搜索结果缓存起来。...不过,在这两种场景,你仍需要一个 ViewModel 来避免因配置更改而重新数据库中加载数据导致资源浪费。 ViewModel 是 Loader 一个替代品吗?...ViewModel 与其他架构组件 LiveData 和 Room 一起使用可以替代 Loader。ViewModel 保证配置更改数据丢失。LiveData 保证 UI 与数据同步更新。

    3.8K30

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

    注意,很多 UI 数据会自动地被保存和恢复: “该方法默认实现保存了关于 activity 视图层次状态临时信息,例如 EditText 控件文本或者 ListView 控件滚动条位置。”...你也不想在你不需要时候重新数据库加载数据。让我们看一个 activity 例子,在这个 activity 你可以搜索你音乐库: Activity 未搜索时及搜索状态示例。...Activity 在配置更改创建:Activity 会将本次查询保存在 onSaveInstanceState() bundle 参数并且 ViewModel 也会将搜索结果缓存起来。...不过,在这两种场景,你仍需要一个 ViewModel 来避免因配置更改而重新数据库中加载数据导致资源浪费。 ViewModel 是 Loader 一个替代品吗?...ViewModel 与其他架构组件 LiveData 和 Room 一起使用可以替代 Loader。ViewModel 保证配置更改数据丢失。LiveData 保证 UI 与数据同步更新。

    99320

    Android开发笔记(一百六十九)利用BottomNavigationView实现底部标签栏

    在Android Studio上创建官方默认首屏标签页面很方便,首先右击需要添加标签栏模块,在弹出右键菜单依次选择“New”——“Activity”——“Bottom Navigation Activity...(底部导航视图),另一个是位于其上占据剩余屏幕碎片fragment。...底部导航视图又由一排标签菜单组成,具体菜单在@menu/bottom_nav_menu定义;而碎片为各频道主体部分,具体内容在app:navGraph="@navigation/mobile_navigation...onCreateView方法根据布局文件生成页面元素,这样修改频道界面就变成给碎片编码了。...并非必需组件,所以简洁起见省去了ViewModel相关代码,另外两个碎片频道代码依此类推。

    1.4K20

    利用BottomNavigationView实现底部标签栏

    在Android Studio上创建官方默认首屏标签页面很方便,首先右击需要添加标签栏模块,在弹出右键菜单依次选择“New”——“Activity”——“Bottom Navigation Activity...(底部导航视图),另一个是位于其上占据剩余屏幕碎片fragment。...底部导航视图又由一排标签菜单组成,具体菜单在@menu/bottom_nav_menu定义;而碎片为各频道主体部分,具体内容在app:navGraph="@navigation/mobile_navigation...onCreateView方法根据布局文件生成页面元素,这样修改频道界面就变成给碎片编码了。...并非必需组件,所以简洁起见省去了ViewModel相关代码,另外两个碎片频道代码依此类推。

    2.2K30

    ViewModel

    一.视图数据模型之间桥梁ViewModel   在页面(Activity/Fragment)功能较为简单情况下,通常会把UI交互,与数据获取等相关业务逻辑全部写在页面。...如果数据不进行存储,则通常还要去重新获取一次数据。幸运是,ViewModel可以为我们解决这个问题。...最重要作用是将视图数据分离,并独立于Activity重建。...为了验证这一点,我们在ViewModel创建一个计时器,每隔1s钟,通过接口OnTimeChangeListener通知它调用者,并通过这个示例来学习一下ViewModel使用。   ...五.ViewModel和onSaveInstanceState()方法   对于页面数据保存和恢复,也许你有这样疑问,onSaveInstanceState()方法同样可以解决屏幕旋转带来数据丢失问题

    22430

    如何实现VM框架数据绑定

    作者:佳杰 本文原创,转载请注明作者及出处 如何实现VM框架数据绑定 一:数据绑定概述 视图(view)和数据(model)之间绑定 二:数据绑定目的 不用手动调用方法渲染视图,提高开发效率;...统一处理数据,便于维护 三:数据绑定元素 视图(view):说白了就是htmldom元素展示 数据(model):用于保存数据引用类型 四:数据绑定分类 view > model数据绑定:view...数据绑定demo讲解 (如何实现数据改变,导致UI界面重新渲染) 简易思路 > 1.通过defineProperty来监控model所有属性(对每一个属性都监控) > 2.编译template生成...创建数据监控对象this.observer,该对象监控data(监控以后,data属性改变, 就会执行definePropertyset函数,set函数里面添加了publish发布函数)...,但又不想费劲地查找dom元素再去修改元素值, 这种情况下,可以用demo数据绑定,只需修改数据值,就实现了页面元素重新渲染 请看下面的gif动画中展示,只要修改data.age和data.name

    3.2K80

    Jetpack系列——ViewModel

    Jetpack为开发者提供了ViewModel概念,将页面所需要数据从V层和M层剥离出来,ViewModel是介于View层和Model层一个桥梁,使得视图数据即区分开来,又能保持联系。...生命周期 当Android应用程序退回到桌面,或者横竖屏切换时,Activity等组件可能会丢失状态或者是被销毁,这时,开发者通常需要考虑数据保存和恢复,常见就是通过onSavaInstanceState...ViewModel独立于组件配置变化,也就是说,当发生特殊情况导致Activity重新执行某些生命周期时,ViewModel生命周期并不会发生变化。...[1240] 上述代码也介绍了最重要一个点,那就是ViewModel实例创建,首先需要创建一个ViewModelProvider类对象,其构造方法需要传入Activity实例,在androidx...,但当页面被彻底销毁时,ViewModel数据也就不复存在了。

    62010

    区域设置更改和 AndroidViewModel 反面模式

    ViewModel ,如果要公开来自资源(字符串、可绘制文件、颜色……)数据,则必须着重考虑 ViewModel 对象而忽视配置更改,例如区域设置更改。...当用户更改其区域设置时,活动将重新创建,但不创建 ViewModel 对象。 AndroidViewModel 是已知应用程序上下文 ViewModel 子类。...让我们看看跟踪器基于此问题示例:在系统区域设置更改时更新 ViewModel 。...如果有区域设置更改,则不会重新创建视图模型。这将导致我们应用程序显示废弃数据,因此只能部分本地化。...由于视图(活动、片段等)具有生命周期意识,因此它将在配置更改重新创建,以便正确地重新加载资源。

    11810

    vue双向绑定原理

    View:视图层(UI 用户界面) ViewModel:业务逻辑层(一切 js 可视为业务逻辑,也就是前端日常工作) Model:数据层(存储数据及对数据处理如增删改查) MVVM 将数据双向绑定...,可同布更新视图层,当视图层发生变化时候,同步更新数据层 双向绑定核心: Object.defineProperty() Object.defineProperty(obj, prop, descriptor...} } 将获取到data数据更新到文档碎片中 function nodeToFragment(node, vm) { var fragment = document.createDocumentFragment...将data数据渲染到页面上啦 第二步是当页面上数据发生变化时候 将最新数据更新到data 首先我们需要拦截data对象所有属性 这样当页面数据发生改变 我们会在setter函数监听到数据变化并拿到最新数据...一个完整订阅发布模式,由发布者、订阅者、消息管理器三部分组成 在双向数据绑定 每当有数据发生变化就要发布一个通知 让视图层更新 那么在set函数中就要发布订阅函数 而每一个对象属性都是订阅者

    18420

    区域设置更改和 AndroidViewModel 反面模式

    ViewModel ,如果要公开来自资源(字符串、可绘制文件、颜色……)数据,则必须着重考虑 ViewModel 对象而忽视配置更改,例如区域设置更改。...当用户更改其区域设置时,活动将重新创建,但不创建 ViewModel 对象。 ? AndroidViewModel 是已知应用程序上下文 ViewModel 子类。...让我们看看跟踪器基于此问题示例:在系统区域设置更改时更新 ViewModel 。...如果有区域设置更改,则不会重新创建视图模型。这将导致我们应用程序显示废弃数据,因此只能部分本地化。...由于视图(活动、片段等)具有生命周期意识,因此它将在配置更改重新创建,以便正确地重新加载资源。

    1.2K60

    mongoDB设置权限登陆,在keystonejs创建数据库连接实例

    # 问题 mongoDB默认登陆时无密码登陆,为了安全起见,需要给mongoDB设置权限登录,但是keystoneJS默认是无密码登陆,这是需要修改配置来解决问题 # 解决 在keystone.js...brand': 'recoluan', 'mongo': 'mongodb://user:password@host:port/dbName', }); 1 2 3 4 5 复制 这里需要注意是...,mongoDB在设置权限登录时候,首先必须设置一个权限最大主账户,它用来增删其他普通账户,记住,这个主账户时 无法 用来设置mongo对象, 你需要用这个主账户创建一个数据库(下面称“dbName...”),然后在这个dbName上再创建一个可读写dbName普通账户,这个普通账户user和password和dbName用来配置mongo对象

    2.4K10

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

    二、Android开发架构 具体到Android开发,开发架构就是描述 视图层、逻辑层、数据层 三者之间关系和实施: 视图层:用户界面,即界面的展示、以及交互事件响应。...View,视图,即Activity/Fragment ViewModel视图模型,负责业务逻辑。 注意,MVVM这里ViewModel就是一个名称,可以理解为MVPPresenter。...ViewModel层 用于持有和UI元素相关数据,以保证这些数据在屏幕旋转时不会丢失,并且还要提供接口给View层调用以及和仓库层进行通信。...UserListViewModel 会在配置更改自动恢复,所以一旦创建 Activity,它就会接收相同 ViewModel 实例,并且会立即使用当前数据调用回调。...因此,如果用户在离开页面再返回,则应用必须重新获取数据,即使数据未发生更改也是如此。这就浪费了宝贵网络资源,迫使用户等待新查询完成。

    2K20

    ViewModel 和 LiveData:为设计模式打 Call 还是唱反调?

    Activity 和 Fragment 可以被销毁并且重新创建ViewModel 将对此一无所知。 ?...这样有几个好处: ViewModel 在配置重新加载(比如屏幕旋转)时候是不会变化,所以没有必要从外部(比如网络和数据库)重新获取数据。...当耗时操作结束ViewModel “被观察者”被更新,无论这些数据当前有没有观察者。这样不会有尝试直接更新不存在视图情况,也就不会有 NullPointerException。...在示例,我们继承 LiveData 创建一个叫做 SingleLiveEvent 类来解决这个问题。它仅仅发送发生在订阅更新,要注意是这个类只支持一个观察者。...UI 观察者模式和数据回凋 如果用户退出 APP,视图就消失了所以 ViewModel 也没有观察者了。

    3.1K30

    Android  JetPack~ ViewModel (一)   介绍与使用

    ViewModel,MVVM框架一部分,他主要作用是处理业务逻辑、数据分配等,他是Mode和VIew连接桥梁,和MVP相比,他类似P。...设备信息发生变更数据不会丢失(切横竖屏),其实它只有一个生命周期,检测页面销毁时触发 ViewModel 另一个特点就是同一个 Activity Fragment 之间可以使用ViewModel实现共享数据...create是创建一个新实例,而get是先从HashMap找,找不到就创建实例。...:使用getActivity()获得ViewModel 作用域在Activity里和所有他创建碎片里,意思是你在其他Fragment也获取相同内存地址ViewModel @Override public...创建ViewModel数据是独立 4、总结 使用起来非常简单,还要多加练习,才不会被那些xx面试官问步骤咋实现难住。

    65740

    如何让 SwiftUI 列表变得更加灵活

    前言 List 可能是 SwiftUI 附带内置视图中最常用一种,它使我们能够在任何 Apple 平台上呈现“类似于表格视图用户界面。...然后,让我们使用另一个新功能,集合元素绑定,让系统自动为我们 articles 数组每个元素创建一个可变绑定: struct ArticleList: View { @ObservedObject...在这种情况下,用户可以轻松在项目视图上滑动来决定喜不喜欢对应文章: struct ArticleList: View { @ObservedObject var viewModel: ArticleListViewModel...不仅如此,下拉刷新是由 async/await 提供支持,不需要增加任何额外代码就可以让系统知道什么时候重新加载结束。...总结 SwiftUI 正在变得更加灵活和强大,后面我将继续探索更多新推出 API,并在这里发布分享,欢迎持续关注,为了防止丢失,建议为本号设置星标。

    4.9K41
    领券