悬浮窗体为何会内存泄漏

原因主要看各个组件的生命周期来看问题

    public void closeWin(ParamType type) {
        if(type == ParamType.FLOAT_WIN_TOOLS) {
            wm.removeViewImmediate(mContentView);
            Log.d(TAG, "closeWin: mContentView");
            isShowing = false;
        }else if(type == ParamType.FLOAT_WIN_SMALL) {
            wm.removeViewImmediate(mContentSmallView);
            isShowing = false;
        }
        mContentView = null;
        binding = null;
        mContentSmallView = null;
        binding2 = null;
    }

提示这个FloatWin 内存泄漏,然后找问题
1,首先可能会想到context
默认可能需要用到最长生命周期的,和打开窗体的service同步
但是context 是APP context
就没办法了
2,提示布局泄漏
重点关注布局
猜测可能是remove 后并未回收,然后被后台打开悬浮窗口的service 占用Floatwin 占用 布局的对象
3,所以
所以需要了解到这个代码区别

wm.removeViewImmediate(mContentView); // 1

wm.removeView(mContentView);  // 2

经过百度发现
1 是同步删除,这个是我需要的
在关闭窗体的时候立刻移除

但是又想错了
同步删除 == 不显示窗体
和mContentView 泄漏没关系

所以最后是在show的时候创建布局,在close的时候销毁对象(赋值为null)
或者可以使用弱引用

完美解决
特别注意空指针异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值