Activity的onDestroy延迟10秒执行的解决步骤
一、概述
测试提出的bug:1.直播界面关闭后再次进入直接跳转到了播放结束 、2.聊天室按回车键时不时的会跳转到结束页面或者错误页面 、3.选择相册双击选中的图App崩溃
还有一些其他的问题我就不一一说了,总之就是一句话:出bug了。如何解决?不管怎样看以上三个bug感觉上都毫无关联,起初我也是这样认为的。但是后来经过测试和反复验证发现:其实他们三个是同一个问题导致的--->资源释放不及时onStop和onDestroy延迟7~10秒才执行。其本质原因是消息队列太忙导致onDestroy都来不及执行。原理就不说了晚上一堆【原理】,直接说解决过程
二、解决过程
测试工具我就用了两个:
1.重写FrameLayout做为跟布局打印日志。原理:如果有View在不停的刷新则会一直打印异常信息
/** * 根目录的FrameLayout 用于验证View刷新重绘 */ class RootFrameLayout(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs) { private val TAG = "RootFrameLayout" override fun requestLayout() { Log.e(TAG,"requestLayout",Exception()) super.requestLayout() } override fun invalidateChildInParent(location: IntArray?, dirty: Rect?): ViewParent { Log.e(TAG,"invalidateChildInParent",Exception()) return super.invalidateChildInParent(location, dirty) } override fun onDescendantInvalidated(child: View, target: View) { super.onDescendantInvalidated(child, target) Log.e(TAG,"onDescendantInvalidated",Exception()) } }
2.使用Handler的日志工具打印,如果主线程消息队列繁忙则此处的日志会一直打印,速度会非常快,否则不会。
/** * 监控主线程消息调用的频繁度 */ private fun timMainThread(){ Handler(Looper.getMainLooper()).looper.setMessageLogging { x -> Log.e( "MainActivity", x.toString() ) } }
三、引起主线程繁忙的主要问题(我这边测试下来发现的)
1.在Handler.post(Runnable)中的Runnable中给自己发消息,也就是死循环发消息,且发的速度特别快
2.绘制死循环,也就是在自定义View的onDraw方法中调用invalidate方法
3.在子线程中频繁的调用自定义View的postInvalidate
4.布局嵌套导致的死循环
CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout,需要去掉CollapsingToolbarLayout,不然主线程会处于半死机状态(主线程消息会非常繁忙)
最终将CollapsingToolbarLayout换成了FrameLayout,ps:原因未深究,猜测是因为布局签到死循环invalidate或者requestLayout导致的
去除根节点的android:fitsSystemWindows="true"属性,因为其会导致UI频繁的刷新,ps:原因未深究
5.动画不及时释放(我的项目中没遇到,看到网上有人这样说)
6.WebView中包含动画会一直的不到释放,这个东西对onDestroy影响不大,最好单独开进程
7.LottieAnimationView注意这个类,用的时候开启,不用的时候释放(虽然对onDestroy的释放影响不大)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!