奇怪的内存溢出,Snackbar使用中的坑

博客探讨了一个在Android应用中由于错误使用Snackbar导致的内存溢出问题。作者通过LeakCanary发现了问题根源:未显示的Snackbar在 AccessibilityManager 中注册了一个监听器,导致内存泄漏。解决方案是按需初始化Snackbar,遵循按需加载原则,同时推荐在开发时使用LeakCanary来检测内存泄漏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

环境

发现问题

分析问题

解决办法

建议

LeakCanary


环境

support包版本28

项目中有使用到Snackbar,但是使用过程中有一些问题。

发现问题

因为程序中有崩溃日志记录,经常发现有个拍照上传的页面会出现oom问题,但是检查几次,发现并没有明显的问题。

后来通过LeakCanry发现一处内存泄漏问题,没想到是SnackBar内部出现了内存泄漏

分析问题

通过 Snackbar.make方法创建Snackbar时,会创建一个根布局SnackbarBaseLayout

    protected SnackbarBaseLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
            TypedArray a = context.obtainStyledAttributes(attrs, styleable.SnackbarLayout);
            if (a.hasValue(styleable.SnackbarLayout_elevation)) {
                ViewCompat.setElevation(this, (float)a.getDimensionPixelSize(styleable.SnackbarLayout_elevation, 0));
            }

            a.recycle();
            this.accessibilityManager = (AccessibilityManager)context.getSystemService("accessibility");
            this.touchExplorationStateChangeListener = new TouchExplorationStateChangeListener() {
                public void onTouchExplorationStateChanged(boolean enabled) {
                    SnackbarBaseLayout.this.setClickableOrFocusableBasedOnAccessibility(enable
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值