解决fragment的子fragment中viewpager里面的fragment不销毁 反复创建问题

2024-05-04 12:48

本文主要是介绍解决fragment的子fragment中viewpager里面的fragment不销毁 反复创建问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 苦苦研究了很久, 以前遇到这头疼的问题是 写的广播回调高仿startactivyforresult 改成startfragmentforresult 结果 这个玩意导致支多次回调,原因是原来的fragment并没有销毁 为什么没用为什么不走destory 真的是内存泄露吗? 为什么 destoryItem都不走,又怎么走destory()注销广播的方法,但是非常烦躁,结果 放弃使用广播 实现异步通讯 。用eventbus,但是实际上这个问题还是存在的。
 
时间过去了很久 再一次 的时候我心血来潮 再次查看 适配器的源码和viewpger的源码 。终于弄出了一套完美无bug的解决方法。
在返回键 或其他关闭veiwapger那个界面行为的时候先调用 ,然后 弹栈 。就可以 让它成功调用。
FragmentStatePagerAdapter
使用这种 会导致反复创建,一直缓冲着
FragmentPagerAdapter
使用这种 则一直缓存着虽然下次进入子fragment然后viewpager读取的还是原来的。 如果使用缓冲view的basefragment的写法 那么第二次打开这个页面会出现空白,这个可以使用每次绘制的方法单独解决此问题。

而我这里是做到 让viewpager维护的fragment 手动控制其销毁。 
 
 
 try {//可能出现 adapter内部维护的 list和我这里的不一致
            Field field = adapter.getClass().getSuperclass().getDeclaredField("mFragments");field.setAccessible(true);ArrayList<Fragment> mFragments = (ArrayList<Fragment>) field.get(adapter);//false 则是不关闭mFragments
            if (mFragments != null) {for (int i = 0; i < mFragments.size(); i++) {adapter.destroyItem(mViewPager, i, mFragments.get(i));}adapter.finishUpdate(mViewPager);//提交事务
            }
//            if(close){
//                dialog.cancel();
//            }


        } catch (Exception e) {}
 
这句话就完美让viewpager里面的fragment销毁了
大家会嘲笑 我写的怎么就调用 destory() 因为你是用activity 维护的 activity里面的viewpager自然使用自然正常啦!!
上面我之前尝试 不用反射的写法,但是 如果使用了setOffscreenPageLimit  那么问题就大发了和里面维护的 item 缓存条目不一致 ,就会出现数组越界。 在destoryItem里面有一句代码叫   mFragments.set(position, null); 
所以 就会出现毛病,然后我直接把这句话删除了,结果也有千分之一的机会出现 。
 
虽然解决了,但是这没法解决多个tab之间 的问题 除非每个tab点击你就原来那边维护的 销毁,这太蛋疼了。  所以我首页 没弄,再说了首页的这么多tabhost选项卡里面的viewpger页面选项卡 缓存就缓存首页关闭 activity就关闭了 关闭了自然会调用onstory()
 
源码还没看懂 为么fragment+子fragment不走destoryItem方法。

这篇关于解决fragment的子fragment中viewpager里面的fragment不销毁 反复创建问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/959227

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基