Closed LHGuang closed 1 year ago
我不知道是否和compose有关,我之前用的那个compose版本是有个内存泄漏问题的,但是今天我更新了compose版本后测试发现没有出现过内存泄漏的问题
小伙子,根据你提供的信息,我十分确定及肯定回答你,这个内存泄漏不是框架引发的,具体你可以分析一下框架创建 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 {
......
}
但是 ActivityToast 并不是系统 Toast 的子类,里面的实现也没有用到 Toast 东西,都是用纯 WindowManager 来实现。
所以我 100% 确定你说的这个问题,肯定不是框架导致的问题,应该是你的项目中其他地方调用了系统 Toast 导致的。
非常抱歉轮子哥,的确不是框架引起的,但是我整个项目也没有使用到toast的使用的依赖也很确定没有使用toast的,我怀疑很大概率是由compose引起的因为我切换回之前的compose版本就又出现这个内存泄漏问题了
框架版本【必填】
12.3
问题描述【必填】
在AndroidStudio的profile和LeakCanary上都捕捉到内存泄漏的问题,我看到曾经有issue提到过9.6版本也出现过这个问题,而且和我发现的LeakCanary上的信息都一样
复现步骤【必填】
偶现的问题,尝试了多次无法找到出现的规律
是否必现【必填】
否
项目 targetSdkVersion【必填】
33
出现问题的手机信息【必填】
小米10
出现问题的安卓版本【必填】
Android 11
问题信息的来源渠道【必填】
No response
是部分机型还是所有机型都会出现【必答】
暂时只在小米上测试无法确定其他机型
框架最新的版本是否存在这个问题【必答】
是
框架文档是否提及了该问题【必答】
否
是否已经查阅框架文档但还未能解决的【必答】
否
issue 列表中是否有人曾提过类似的问题【必答】
是
是否已经搜索过了 issue 列表但还未能解决的【必答】
是
是否可以通过 Demo 来复现该问题【必答】
否
提供报错堆栈
No response
提供截图或视频
提供解决方案
No response