版本3.3.3 内存泄露解决方案
解决方案: 在BaseActivity 或者普通的Activity onDestroy函数中调用。 try { val immersionBar = ImmersionBar.with(this) val destroyMethod = immersionBar.javaClass.getDeclaredMethod("onDestroy") destroyMethod.isAccessible = true destroyMethod.invoke(immersionBar) } catch (e: Exception) { e.printStackTrace() }
补充说明:切记不要在开屏页使用ImmersionBar.with(this).xxxxx、开屏页生命周期很快、sdk内部Fragment 来不及收到相关生命周期回调(onDestroy)、易会造成内存泄露。
建议作者、放开部分私有函数(释放监听相关的函数)
问题定位:
这里的 this::onNavigationBarListener 属于 Java 8 的方法引用(底层原理和 Lambda 表达式基本一致) 这个 Lambda 隐式持有了当前的 ImmersionBar 实例,而 ImmersionBar 又持有当前的 mActivity、这就是问题原因
这个机制存在严重缺陷: 在以下两种场景中,不可见 Fragment 的 onDestroy 极易丢失或被系统跳过,导致监听器永远无法解绑:
1、闪屏页 (SplashLaunchActivity):闪屏页通常存活时间极短(倒计时结束立刻 finish() 并跳转),此时 Fragment 可能还未完全挂载完毕就被强制销毁。
2、暴力清栈 (CLEAR_TASK):重新登录触发 Intent.FLAG_ACTIVITY_CLEAR_TASK 时,系统直接暴力回收 Activity,导致生命周期回调错乱。
Source: gyf-dev/ImmersionBar