getActivity / Toaster

Android 吐司框架,专治 Toast 各种疑难杂症
Apache License 2.0
3.25k stars 406 forks source link

[Bug]:在AndroidStudio的profile和LeakCanary上都捕捉到内存泄漏 #118

Closed LHGuang closed 1 year ago

LHGuang commented 1 year ago

框架版本【必填】

12.3

问题描述【必填】

在AndroidStudio的profile和LeakCanary上都捕捉到内存泄漏的问题,我看到曾经有issue提到过9.6版本也出现过这个问题,而且和我发现的LeakCanary上的信息都一样

复现步骤【必填】

偶现的问题,尝试了多次无法找到出现的规律

是否必现【必填】

项目 targetSdkVersion【必填】

33

出现问题的手机信息【必填】

小米10

出现问题的安卓版本【必填】

Android 11

问题信息的来源渠道【必填】

No response

是部分机型还是所有机型都会出现【必答】

暂时只在小米上测试无法确定其他机型

框架最新的版本是否存在这个问题【必答】

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

issue 列表中是否有人曾提过类似的问题【必答】

是否已经搜索过了 issue 列表但还未能解决的【必答】

是否可以通过 Demo 来复现该问题【必答】

提供报错堆栈

No response

提供截图或视频

微信截图_20230823150339 微信图片_20230823152510

提供解决方案

No response

LHGuang commented 1 year ago

我不知道是否和compose有关,我之前用的那个compose版本是有个内存泄漏问题的,但是今天我更新了compose版本后测试发现没有出现过内存泄漏的问题

getActivity commented 1 year ago

小伙子,根据你提供的信息,我十分确定及肯定回答你,这个内存泄漏不是框架引发的,具体你可以分析一下框架创建 Toast 的代码:

public class ToastStrategy implements IToastStrategy {

    ......

    @Override
    public IToast createToast(IToastStyle<?> style) {
        Activity foregroundActivity = ActivityStack.getInstance().getForegroundActivity();
        IToast toast;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
                Settings.canDrawOverlays(mApplication)) {
            // 如果有悬浮窗权限,就开启全局的 Toast
            toast = new GlobalToast(mApplication);
        } else if (foregroundActivity != null) {
            // 如果没有悬浮窗权限,就开启一个依附于 Activity 的 Toast
            toast = new ActivityToast(foregroundActivity);
        } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N_MR1) {
            // 处理 Android 7.1 上 Toast 在主线程被阻塞后会导致报错的问题
            toast = new SafeToast(mApplication);
        } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q &&
                !areNotificationsEnabled(mApplication)) {
            // 处理 Toast 关闭通知栏权限之后无法弹出的问题
            // 通过查看和对比 NotificationManagerService 的源码
            // 发现这个问题已经在 Android 10 版本上面修复了
            // 但是 Toast 只能在前台显示,没有通知栏权限后台 Toast 仍然无法显示
            // 并且 Android 10 刚好禁止了 Hook 通知服务
            // 已经有通知栏权限,不需要 Hook 系统通知服务也能正常显示系统 Toast
            toast = new NotificationToast(mApplication);
        } else {
            toast = new SystemToast(mApplication);
        }
        if (isSupportToastStyle(toast) || !onlyShowSystemToastStyle()) {
            diyToastStyle(toast, style);
        }
        return toast;
    }

    ......
}
public class ActivityToast extends CustomToast {

    ......
}

public abstract class CustomToast implements IToast {

    ......
}
LHGuang commented 1 year ago

非常抱歉轮子哥,的确不是框架引起的,但是我整个项目也没有使用到toast的使用的依赖也很确定没有使用toast的,我怀疑很大概率是由compose引起的因为我切换回之前的compose版本就又出现这个内存泄漏问题了