解决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

相关文章

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at