美文网首页
极简耗时方法检测器

极简耗时方法检测器

作者: 小鱼爱记录 | 来源:发表于2019-08-01 19:02 被阅读0次

原理

开启一个异步线程,每过一段时间(比如100ms)就去获取主线程的栈帧
如果当前栈帧和上一个栈帧一样,就说明主线程阻塞了,就打印当前的栈帧

注意:需要过滤掉系统的阻塞方法

代码

package com.daigou.sg.helper

import android.os.Handler
import android.os.HandlerThread
import android.os.Looper
import android.util.Log

/**
 * Author:Yutianran on 2019-08-01 16:57
 */
object BlockDetectUtil {

    private val TIME_BLOCK = 100L//阈值,可以自己配置

    private val whiteList = mutableListOf<String>().apply {
        add("android.os.MessageQueue.nativePollOnce")
        add("ThreadedRenderer.nSyncAndDrawFrame")
    }

    private val ioHandler: Handler by lazy {
        val handlerThread = HandlerThread("BlockDetectUtil")
        handlerThread.start()
        return@lazy Handler(handlerThread.looper)
    }

    @JvmStatic
    fun init() {
        ioHandler.post(ioRunnable)
    }

    private val ioRunnable = object : Runnable {

        var last = ""

        override fun run() {
            val stackTraceString = getMainThreadStackTrace()
            if (checkBlock(stackTraceString)) {
                Log.e("BlockDetectUtil", "当前方法耗时超过${TIME_BLOCK}ms:\n $stackTraceString")
            }
            last = stackTraceString
            ioHandler.postDelayed(this, TIME_BLOCK)
        }

        private fun getMainThreadStackTrace(): String {
            val sb = StringBuilder()
            val stackTrace = Looper.getMainLooper().thread.stackTrace
            for (s in stackTrace) {
                sb.append(s.toString() + "\n")
            }
            return sb.toString()
        }

        private fun checkBlock(stackTraceString: String): Boolean {
            whiteList.forEach {
                if (stackTraceString.contains(it)) {
                    return false
                }
            }
            if (last == stackTraceString) {
                return true
            }
            return false
        }

    }

}

效果

相关文章

  • 极简耗时方法检测器

    原理 开启一个异步线程,每过一段时间(比如100ms)就去获取主线程的栈帧如果当前栈帧和上一个栈帧一样,就说明主线...

  • 写给兴成长计划的诗2 ——我和王子有个约会(一)

    自参加王子微课2.0极简教育技术课程学习以来,边实际操作边打卡,颇有收获。极简教育技术——方法极简,作用极...

  • 用“从新开始”的勇气体会极简主义

    近期阅读了《极简主义》,书中不但介绍了作者邂逅到拥抱极简主义的过程、极简主义的时间方法,还有关于“意义”、关于“幸...

  • 9.3 检测边

    原图 灰度图 Sobel水平检测器 Sobel垂直检测器 Laplacian拉普拉斯检测器 Canny检测器

  • 一日一丢

    一日一丢,是极简主义者的极简方法。每天丢掉一件物品。 实行极简主义以来,我丢掉了不少厨房用品。丢掉...

  • 浅淡移动互联网产品新趋势-极简主义设计

    一.极简主义的产品设计 1.极简主义理念 极简主义的理念是“少即是多”。采用最简单的形式、最基本的处理方法、最理性...

  • 极简之路

    极简的类型分很多种,极简的方法也分很多种,同样的方法对于不同阶段的你来说,可能作用和效果也不一样。 很多人是看到极...

  • 若不是为了倾尽全力实现梦想,极简生活又有何用?

    市面上已经有许多关于极简生活理念与方法的书,然而,重要的是,我们需要知道极简生活是工具,不是目的。那么,极简生活的...

  • 色谱毛细柱老化正确清洗与误区介绍

    色谱毛细柱老化 方法:将色谱柱安装好后,接通载气,并与检测器断开(保护检测器),载气流速一般为2-5mL/min,...

  • 极简主义

    1、欲望极简2、精神极简3、物质极简4、信息极简5、表达极简6、工作极简7、生活极简

网友评论

      本文标题:极简耗时方法检测器

      本文链接:https://www.haomeiwen.com/subject/dagcdctx.html