Android如何检查线程有耗时任务

framework:

WatchDog

  • 1.检查是否发生了死锁
  • 2.线程是否被任务block


    image.png

以AMS 为例查看源码:startOtherServices
检测线程死锁有个很好的方法:
就是一直去尝试获取当前线程的锁,如果一直拿不到那就有可能死锁了

BlockCanary

其实是利用looper机制,如下:

public static void loop() {
 final MessageQueue queue = me.mQueue;
    for (;;) {
     //这里可以手动的设置一个mLogging
     final Printer logging = me.mLogging;
       if (logging != null) {
                logging.println(">>>>> Dispatching to " + msg.target + " " +
                        msg.callback + ": " + msg.what);
        }
        //分发消息
         msg.target.dispatchMessage(msg);
        if (logging != null) {
                logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
        }
      }
  }

其实就是手动给设置一个mLogging,然后去分别去计算
Dispatching 到 Finished 的时间 ,来判断当前handler线程执行的时间。
可以通过如下 方式,就可以更加优雅得计算当前系统任务的耗时时间了。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getMainLooper().setMessageLogging(new Printer() {
        @Override
        public void println(String x) {
       //">>>>> Dispatching to " + msg.target + " " +msg.callback + ": " + msg.what
       //可以去计算当前花费的时间 来判断一个任务(handleMessage(Message msg))是的执行时间
       // "<<<<< Finished to " + msg.target + " " + msg.callback
        }
  });
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 卡顿是非常直观的用户体验,它的特点是:产生原因错综复杂,线上问题难以复现。基于这个特点,卡顿优化主要是三方面工作:...
    Stan_Z阅读 16,697评论 6 30
  • Android系统运行以后,System_server中可能有成百上千个线程在运行,各种服务之间调用很频繁,也很复...
    Nipuream阅读 1,038评论 0 1
  • 第5章 多线程编程 5.1 线程基础 5.1.1 如何创建线程 在java要创建线程,一般有==两种方式==:1)...
    AndroidMaster阅读 1,815评论 0 11
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,588评论 16 22
  • 创业是很多人的梦想,多少人为了理想和不甘选择了创业来实现自我价值,我就是其中一个。 创业后,我由女人变成了超人,什...
    亦宝宝阅读 1,893评论 4 1