关于viewpager常见的泄漏

Android ViewPager与ViewPageIndicator实现高效Tab导航 在Android应用开发中,页面滑动切换是提升用户体验的核心交互模式。ViewPager作为AndroidX的核心组件,通过FragmentPagerAdapter实现了页面动态加载与内存管理,配合页面复用机制确保滑动流畅性。ViewPageIndicator则弥补了原生ViewPager缺乏可视化指示器的缺陷,提供Tab样式、圆点等多种导航样式选择。这对组合特别适合需要高度自定义UI的新闻类、电商类应用场景,既能通过ViewPager的BEHAVIOR_RESUME_ONLY_CURRENT_FRAGME 阅读详情
在一个页面中 如果有用到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 Fragment
        val fragmentWorkout = SportFragment.newInstance()
        val fragmentChallenges = EntertainmentFragment.newInstance()

        fragments.add(fragmentHome)
        fragments.add(fragmentWorkout)
        fragments.add(fragmentChallenges)


        BarUtils.setStatusBarLightMode(requireActivity().window, true)
        fromFragment = fragmentHome
        val transaction: FragmentTransaction = requireActivity().supportFragmentManager.beginTransaction()



        if (hopeToPosition == 1) {
            fromFragment = fragmentWorkout
            (fromFragment as SportFragment).changeTab(workoutType)
            dataBinding.navigationLaunch.menu.getItem(1).isChecked = true
            tabIndex = 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().supportFragmentManager
            val 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().supportFragmentManager
        val transaction = manger.beginTransaction()
        val tag = "fragment_$position"
        LogUtils.d("linlian mainfragment switchFragment $position")
        // 查找已存在的 Fragment
        val existingFragment = manger.findFragmentByTag(tag)
        val newFragment = when (position) {
            0 -> ARouter.getInstance().build(RrouterConstant.HOME_MAIN_FRAGMENT)
                .navigation() as Fragment

            1 -> SportFragment.newInstance()
            else -> EntertainmentFragment.newInstance()
        }

        if (existingFragment != null) {
            transaction.show(existingFragment)
        } else {
            transaction.add(R.id.vp_fragment, newFragment, tag)
        }
        fragmentTags[position] = tag
        // 隐藏其他 Fragment
        manger.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

ControlCAN.dll开发适配USBCAN_E/2E_U设备 摘要:本文提供了USBCAN_E/2E_U设备的配置指南:1)安装专用驱动;2)获取最新的ControlCAN.dll文件;3)修改VCI调用顺序,新增VCI_SetReference函数设置波特率;4)使用工具计算波特率配置值,并给出了常见波特率对应的代码参考值(如500K对应0x060007)。配置过程强调使用特定工具计算精确的波特率参数,并提供了相关软件下载链接。 阅读详情

相关推荐

三菱RJ71EIP91与SYSMAC Gateway通讯配置

三菱RJ71EIP91与SYSMAC Gateway通讯配置

zhang1270的博客 1527

关于viewpage + FragmentPagerAdapter 当调用 notifydatasetchanged 造成其中的fragment内存泄漏

ViewPager 和 FragmentPagerAdapter 的使用中,调用 notifyDataSetChanged() 可能导致内存泄漏,这通常与 Android 系统管理 Fragment 的方式有关。为了深入理解这个问题,我们需要从 FragmentPagerAdapter 和 ViewPager 的源码入手。FragmentPagerAdapter 是 PagerAdapter 的子类,它主要用于管理少量静态页面。它的工作原理是将每个页面作为一个 Fragment 保存在内存中,并在需要时显示

易帜¤的博客 1171

python进行windows系统UI自动化之【pyautoit】

一般以我们平时操作,会从下图上方的地址栏进行操作,这里注意可以直接从下方的文件名处,输入对应的绝对地址,如:F:\程序设计书籍\《啊哈!pyautoit 是一个用python写的基于AutoItX3.dll的接口库,用来进行windows窗口的一系列操作,也支持鼠标键盘的操作。点击上访的图标,进行拖拉,到想访问的位置,注意下图两个红框中的数值,上面的框表示页面的标题和类,下面的框表示控件的类和序号(一般连起来使用)打开Auto Window Info(x64)或Auto Window Info(x86)

weixin_43936332的博客 9319

记录ViewPager+fragment 内存泄露问题

首先是检测内存泄露的最大利器:Leakcanary 依赖和接入很是简单: debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.3' releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.3' // O...

盼盼的博客 8942

[语义分割]SPP、空洞卷积与ASPP总结

ASPP全称:Atrous Spatial Pyramid Pooling,中文可以理解为空洞空间卷积池化金字塔或者多孔空间金字塔池化。在这其中,要理解两个概念:一个是SPP,池化金字塔结构或者叫空间金字塔池化层,都是一个东西;另一个是Atrous,空洞卷积,两个加在一起就是ASPP。 首先说一下SPP:Spatial Pyramid Pooling。这个结构出自于论文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Re

lipengfei0427的博客 2万+

不用买VR设备!用UE5内置模拟器开发虚拟现实项目的完整教程

本文提供了一套无需购买昂贵VR硬件的虚拟现实开发最佳实践方案。详细介绍了如何利用虚幻引擎5内置的XR模拟器,从零开始配置开发环境、模拟操作、构建场景并实现核心交互逻辑。通过这套纯软件方案,开发者可以高效学习VR开发核心,大幅降低入门门槛和成本。

weixin_29019241的博客 625

Android ViewPager与ViewPageIndicator组合开发实践

在Android开发中,页面滑动切换是常见的UI交互模式。ViewPager作为官方支持库的核心组件,提供了基础的页面滑动能力,但缺乏内置的页面指示器功能。通过结合Jake Wharton开发的ViewPageIndicator开源库,开发者可以实现高度解耦、样式灵活的Tab导航效果。这种经典组合在流畅性、扩展性和社区支持方面表现优异,特别适合需要定制化Tab样式的场景。从技术实现来看,FragmentPagerAdapter与BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT参数的

chongkuachan8070的博客 279

【车载以太网】ATU(Address Translation Unit / Address Table Unit)

【车载以太网】ATU(Address Translation Unit / Address Table Unit)

天赐好车的博客 159

终极指南:如何使用MPAndroidChart实现ViewPager多图表滑动切换

MPAndroidChart是一个功能强大的Android图表视图库,支持折线图、柱状图、饼图等多种图表类型,以及缩放、平移和动画效果。本指南将详细介绍如何通过ViewPager集成多个图表,实现流畅的左右滑动切换效果,让你的数据可视化应用更加专业和用户友好。 ## 为什么选择ViewPager集成图表? 在移动应用开发中,当需要展示多种数据图表时,使用ViewPager实现滑动切换具有以下优

gitblog_00004的博客 369

FANUC机器人_KAREL编程入门学习(1)

FANUC机器人_KAREL编程入门学习(1)

Robot_PLC_HMI_Automation 6429

YOLO11改进|注意力机制篇|引入ELA注意力机制

YOLO11添加ELA注意力机制

A1983Z的博客 3649

android viewpager 删除 fragment,Android App中ViewPager与Fragment结合的一些问题解决

在了解ViewPager的工作原理之前,先回顾ListView的工作原理:ListView只有在需要显示某些列表项时,它才会去申请可用的视图对象;如果为所有的列表项数据创建视图对象,会浪费内存;ListView找谁去申请视图对象呢? 答案是adapter。adapter是一个控制器对象,负责从模型层获取数据,创建并填充必要的视图对象,将准备好的视图对象返回给ListView;首先,通过调用adap...

weixin_39876595的博客 738

【异常】Coze/扣子 Workflow 调用报 4200 错误深度解析

Coze API 的。

奶爸的编程之路,也就一周冷个三天 303

Android ViewPager与Fragment开发实践指南

在移动应用开发中,页面滑动切换是提升用户体验的核心交互模式。ViewPager作为Android官方提供的滑动容器组件,通过PagerAdapter机制实现页面动态加载,与Fragment的模块化特性形成黄金组合。这种技术方案能有效管理UI资源,支持页面状态保存与懒加载优化,广泛应用于电商轮播图、新闻频道切换等高频场景。开发者需要重点关注Fragment生命周期管理、预加载机制调优等关键技术点,例如通过BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT参数控制内存占用,使用ViewP

weixin_42523792的博客 264

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

解决90%的轮播问题:banner项目常见错误与优化方案

# 解决90%的轮播问题:banner项目常见错误与优化方案 banner项目是一款基于ViewPager和ViewPager2实现的Android无限轮播控件,支持自定义Indicator、仿魅族效果和一屏三页等功能。本文将详细介绍使用banner项目时常见的错误及优化方案,帮助开发者快速解决轮播问题。 ## 一、轮播初始化常见错误 ### 1.1 数据加载时机不当导致轮播异常 许多开发者

gitblog_00006的博客 1009

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android:UI控件ViewPager,notifyDataSetChanged

ViewPager的使用: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 ...

weixin_33858485的博客 78

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ViewPager+Fragment嵌套

最近项目中Fragment+ViewPager嵌套Fragment,说一说其中的遇到的问题 首先,使用ViewPager当然会用到PagerAdapter,还好google V4包中有FragmnetPagerAdapter。在使用的时候我就想,同一个FragmentManager管理会不会出问题 果然,黑了。还好惊喜的发现getChildFragmentManager(),用了果然好使。

552

Android ViewPager核心机制与工程实践:从适配器到TabLayout联动

在Android界面开发中,横向分页滑动是引导页、Banner轮播和首页Tab等高频交互场景的基础能力。与连续滚动的ScrollView不同,ViewPager采用离散分页与Snap对齐机制,通过内部预加载与回收复用保障滑动流畅性。理解PagerAdapter的instantiateItem与destroyItem,以及FragmentPagerAdapter与FragmentStatePagerAdapter的差异,是掌握页面状态管理与内存优化的关键。配合TabLayout实现指示器联动,利用OnPage

weixin_29170327的博客 206

android 常见错误_android分割常见的查询和错误

android 常见错误 重点 (Top highlight)The Fragment class in Android is used to build dynamic User Interfaces and should be used within the activity. The biggest advantage of using fragments is that it simpli...

weixin_26727575的博客 495

解决ViewPager适配器PagerAdapter数据更新后页面残留问题

之前遇到过通过数据构造了几个显示View,作为PagerAdapter的数据集,当外面更新这个数据集时,前一次的UI仍然还显示的问题,经过一番折腾,终于完美解决这个问题。方法如下: 1、不要使用View作为数据集 尽量用原始数据来作为数据集,然后在instantiateItem方法里通过数据实时生成需要的View页面 @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, i

移动,移着动动 888

Android Rubber Indicator性能优化终极指南:避免常见的内存泄漏问题

Android Rubber Indicator 是一个优秀的自定义视图组件,它为 ViewPager 提供了流畅的橡皮筋动画效果。然而,在复杂的 Android 应用中,如果不注意性能优化,这个精美的指示器可能会导致内存泄漏问题。本文将为您提供完整的性能优化指南,帮助您避免常见的内存泄漏陷阱,确保您的应用运行流畅稳定。🚀 ## 📊 理解 Rubber Indicator 的内存管理机制

gitblog_00646的博客 544

Android MVVM实战:TabLayout+ViewPager2多模块联动与跨模块通信

MVVM架构通过ViewModel与View解耦,利用LiveData实现数据驱动UI,提升代码可维护性与可测试性。在Android多Tab场景中,结合TabLayout与ViewPager2可高效管理Fragment切换与生命周期,而共享ViewModel(作用域绑定Activity)成为跨模块状态同步的核心机制。这种模式尤其适用于城市列表、地图定位与天气详情等模块的联动需求,通过单一数据源确保状态一致性,避免回调地狱与内存泄漏。本文深入剖析Android MVVM在复杂界面中的落地实践,涵盖TabLay

weixin_29016865的博客 257

FragmentPagerAdapter被弃用后的代替方案

FragmentPagerAdapter被弃用后的代替方案完整解决方案。

u011501017的博客 6733

Android ViewPager2实战:5分钟搞定卡片叠加滑动效果(附完整代码)

本文详细介绍了如何使用Android ViewPager2实现沉浸式卡片叠加滑动效果,包括环境配置、Fragment适配器实现、核心动画效果及性能优化技巧。通过完整的代码示例和实战技巧,帮助开发者快速掌握横向滑动卡片效果的实现方法,提升应用用户体验。

zz67890的博客 823

【Android】ViewPager2与TabLayout深度整合:打造类抖音短视频切换的流畅体验

本文详细介绍了如何在Android开发中使用ViewPager2与TabLayout深度整合,打造类似抖音短视频切换的流畅体验。通过基础整合、动态Tab效果实现、手势交互优化及高级技巧分享,帮助开发者提升页面切换性能与用户体验。重点讲解了FragmentStateAdapter的使用、TabLayoutMediator的配置以及预加载策略优化等关键技术点。

theta的博客 653

Android Banner 2.0终极指南:如何避免Glide图片加载内存泄漏

Android Banner 2.0是一款基于ViewPager2实现的强大广告图片轮播控件,它为Android开发者提供了高度可定制的轮播解决方案。🔥 在移动应用开发中,图片轮播是提升用户体验的关键组件,但很多开发者在使用过程中常常遇到内存泄漏问题,特别是与Glide等图片加载库集成时。本文将为您详细介绍Android Banner 2.0的正确使用方法,重点讲解如何通过生命周期绑定机制有效预

gitblog_00770的博客 430
上一篇: 根据Exif信息纠正图片方向
下一篇: fragment 异常 InstantiationException
lynn8570_blog
博客等级 码龄10年 254粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值