解决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方法。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ViewPagerFragment的生命周期与它所属的Activity的生命周期紧密相连。当ViewPager创建时,会默认加载ViewPager的第一个Fragment。此时,ViewPager会调用Fragment的onAttach()、onCreate()、onCreateView()和onActivityCreated()等生命周期方法。 当用户滑动ViewPager切换到下一个Fragment时,ViewPager会销毁当前显示的Fragment创建新的显示Fragment。此时,ViewPager会依次调用当前Fragment的onPause()、onStop()、onDestroyView()和onDestroy()等生命周期方法,然后调用新Fragment的onAttach()、onCreate()、onCreateView()和onActivityCreated()等生命周期方法。 当用户再次滑动ViewPager返回到之前的Fragment时,ViewPager会重新创建之前的Fragment销毁当前显示的Fragment,同时调用相应的生命周期方法。 总结起来,FragmentViewPager的生命周期可归纳为以下几个阶段: 1. 创建阶段:在ViewPager创建时,会加载第一个Fragment,并调用其onCreate()、onCreateView()和onActivityCreated()等生命周期方法。 2. 切换阶段:当用户滑动ViewPager切换到下一个Fragment时,ViewPager会销毁当前显示的Fragment创建新的显示Fragment。此时,会依次调用当前Fragment的onPause()、onStop()、onDestroyView()和onDestroy()等生命周期方法,然后调用新Fragment的onAttach()、onCreate()、onCreateView()和onActivityCreated()等生命周期方法。 3. 返回阶段:当用户再次滑动ViewPager返回到之前的Fragment时,ViewPager会重新创建之前的Fragment销毁当前显示的Fragment,同时调用相应的生命周期方法。 以上就是FragmentViewPager的生命周期。在ViewPager,通过管理Fragment的切换和销毁,可以提供流畅的页面切换效果,并有效地管理Fragment的生命周期。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值