随笔 - 632  文章 - 17  评论 - 54  阅读 - 92万

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的释放影响不大)

posted on   飘杨......  阅读(1116)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示