当前位置: 首页 > news >正文

关于viewpager常见的泄漏

在一个页面中 如果有用到tab,有需要进行fragment的切换,经常就看到了
private var fragments = arrayListOf<Fragment>()private fun initFragment() {arguments?.let {hopeToPosition = it.getInt(IntentConstant.MAIN_PAGE_GO, 0)workoutType = it.getInt(IntentConstant.WORKOUT_PAGE_GO, 0)challengesTabId = it.getLong(IntentConstant.CHALLENGES_TAB_ID, 0L)}val fragmentHome = ARouter.getInstance().build(RrouterConstant.HOME_MAIN_FRAGMENT).navigation() as Fragmentval fragmentWorkout = SportFragment.newInstance()val fragmentChallenges = EntertainmentFragment.newInstance()fragments.add(fragmentHome)fragments.add(fragmentWorkout)fragments.add(fragmentChallenges)BarUtils.setStatusBarLightMode(requireActivity().window, true)fromFragment = fragmentHomeval transaction: FragmentTransaction = requireActivity().supportFragmentManager.beginTransaction()if (hopeToPosition == 1) {fromFragment = fragmentWorkout(fromFragment as SportFragment).changeTab(workoutType)dataBinding.navigationLaunch.menu.getItem(1).isChecked = truetabIndex = hopeToPosition}transaction.replace(R.id.vp_fragment, fromFragment!!)transaction.commit()}private fun switchFragment(from: Fragment?, to: Fragment?, isResume: Boolean = false) {if (from !== to) {val manger: FragmentManager = requireActivity().supportFragmentManagerval transaction = manger.beginTransaction()if (!to!!.isAdded) {if (from != null) {transaction.hide(from)}if (to != null) {if (isResume) {transaction.add(R.id.vp_fragment, to).commitAllowingStateLoss()} else {transaction.add(R.id.vp_fragment, to).commit()}}} else {if (from != null) {transaction.hide(from)}if (to != null) {if (isResume) {transaction.show(to).commitAllowingStateLoss()} else {transaction.show(to).commit()}}}}fromFragment = to}

但是这样比如在 mainfragment就就强引用了子fragment,这种强应用leakcanary不会报异常,但是Android studio的profile会报泄漏

修复方案

private val fragmentTags = mutableMapOf<Int, String>()private fun switchFragment(position: Int) {val manger: FragmentManager = requireActivity().supportFragmentManagerval transaction = manger.beginTransaction()val tag = "fragment_$position"LogUtils.d("linlian mainfragment switchFragment $position")// 查找已存在的 Fragmentval existingFragment = manger.findFragmentByTag(tag)val newFragment = when (position) {0 -> ARouter.getInstance().build(RrouterConstant.HOME_MAIN_FRAGMENT).navigation() as Fragment1 -> SportFragment.newInstance()else -> EntertainmentFragment.newInstance()}if (existingFragment != null) {transaction.show(existingFragment)} else {transaction.add(R.id.vp_fragment, newFragment, tag)}fragmentTags[position] = tag// 隐藏其他 Fragmentmanger.fragments.forEach { frag ->LogUtils.d("linlian MainFragment hide $frag,tag =${frag.tag},valuse=${fragmentTags.values}")if (frag.tag != null && frag.tag != tag && fragmentTags.values.contains(frag.tag)) {LogUtils.w("linlian MainFragment hide frag !!!$frag")transaction.hide(frag)}}transaction.commit()}

这样就可以不直接引用fragment

相关文章:

  • 23种设计模式全解析及其在自动驾驶开发中的应用
  • Rsync+sersync2实现目录实时同步
  • 模拟SSE流式输出的四种方法
  • 黑马商城(四)网关
  • velocity模板引擎
  • C语言用if else求三个数最小值的一题多解
  • 页内碎片和页外碎片的区别
  • 第十届团体程序设计天梯赛-上理赛点随笔
  • @Validated与@Valid的正确使用姿势
  • Python制作简易PDF查看工具PDFViewerV1.0显示优化
  • 【生态与未来】立足原生仓颉:Cangjie Magic 的生态位与未来发展潜力分析
  • 基于 GPT-SoVITS 实现个性化语音复刻的API服务调用:让小说朗读拥有专属声线
  • 静态成员相关知识
  • AOSP的Doze模式-LightIdle初识
  • 测试基础笔记第六天
  • 『Linux_网络』 第二章 UDP_Socket编程
  • 从《周游记3》演绎歌剧版《菊花台》,周杰伦婚礼曲目意大利文版惊喜亮相
  • docker 搭建nacos 2.2.1版本单机版
  • 下一代互联网
  • java怎么完善注册,如果邮箱中途更换,能否判断
  • 迪卡侬回应出售中国业务30%股份传闻:始终扎根中国长期发展
  • “80后”蒋美华任辽宁阜新市副市长
  • 烟花秀、新航线、购物节......上海邮轮文化旅游节今日开幕
  • 83岁连丽如每周登台说书,还上了15堂连派评书课
  • 《中国奇谭》首部动画电影《浪浪山小妖怪》定档8月2日
  • 牛市早报|国家发改委:将推出做好稳就业稳经济推动高质量发展若干举措