热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

重新加载Fragment时不会破坏范围为Fragment的ViewModel

我的应用允许用户提交表单(AndroidxFragment)以保存数据。提交表单约30次后,应

我的应用允许用户提交表单(Androidx Fragment)以保存数据。提交表单约30次后,应用程序内存不足并崩溃。内存转储的比较表明,问题的根源之一是提交表单时,与表单片段相关联的ViewModel并未被破坏。

使用片段的onViewCreated()方法中的'this'关键字,当前将ViewModel的作用域限定为片段:

vm = new ViewModelProvider(this).get(AddInventoryVM.class);

当用户提交表单时,通过使用“ Android体系结构组件”中的“ Android导航”来导航到同一片段,从而重新加载该片段。

navController.navigate(R.id.addInventoryFragment,null);

在此过渡期间,不会对ViewModel的实例进行垃圾回收。 onViewCreated()被调用并创建ViewModel的新实例-多次发生时会导致内存问题。不会调用'onDestroy()',但是在过渡期间会调用onDestroyView()

原因可能是Fragment实例在过渡期间未销毁(导致未对ViewModel进行垃圾回收)-仅销毁了Fragment的视图。但是,如果是这种情况,则不会增加任何东西-Android不会在过渡时重用现有的ViewModel而不是创建新的ViewModel吗?

尽管存在上述差异,将ViewModel范围限定为Fragment的ViewLifecycleowner()是解决此问题的好方法吗?

因此要更改此内容:

vm = new ViewModelProvider(this).get(AddInventoryVM.class);

对此:

vm = new ViewModelProvider(getViewLifecycleowner()).get(AddInventoryVM.class);


按照Navigate to a destination documentation:


  

Android会维护一个包含您访问过的目的地的后台堆栈。当用户打开应用程序时,您的应用程序的第一个目标位于堆栈上。每次对navigate()方法的调用都会在栈顶放置另一个目标。

因此,当您调用navController.navigate(R.id.addInventoryFragment,null);时,您是将添加库存片段的全新实例添加到后堆栈中,这意味着您的后堆栈现在有两个副本。如果您再次致电navigate(),则将有3个副本,然后有4个副本,等等。

您可以use popUpTo,或者,如果您知道自己总是用它自己替换片段,请使用setLaunchSingleTop(true)

NavOptions optiOns= new NavOptions.Builder()
.setLaunchSingleTop(true)
.build();
navController.navigate(R.id.addInventoryFragment,null,options);

(如果您使用的是 in Navigation XML,则可以使用app:launchSingleTop="true"做同样的事情)


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
author-avatar
手机用户2502929183
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有