zoukankan      html  css  js  c++  java
  • 掉帧的场景

    内部FrameBeat类实现了Choreographer.FrameCallback,可以感知每一帧的绘制时间。通过前后两帧的时间差判断是否有慢函数发生。

    @Override
    public void doFrame(long lastFrameNanos, long frameNanos) {
    if (isIgnoreFrame) {
    mActivityCreatedInfoMap.clear();
    setIgnoreFrame(false);
    getMethodBeat().resetIndex();
    return;
    }

    int index = getMethodBeat().getCurIndex();
    //判断是否有慢函数
    if (hasEntered && frameNanos - lastFrameNanos > mTraceConfig.getEvilThresholdNano()) {
    MatrixLog.e(TAG, "[doFrame] dropped frame too much! lastIndex:%s index:%s", 0, index);
    handleBuffer(Type.NORMAL, 0, index - 1, getMethodBeat().getBuffer(), (frameNanos - lastFrameNanos) / Constants.TIME_MILLIS_TO_NANO);
    }
    getMethodBeat().resetIndex();
    mLazyScheduler.cancel();
    mLazyScheduler.setUp(this, false);

    }
    复制代码
    主线程长时间阻塞UI绘制的场景
    LazyScheduler内有一个HandlerThread,调用LazyScheduler.setup方法会向这个HandlerThread的MQ发送一个延时5s的消息。若没有发生类似ANR的场景,在每一帧的doFrame回调中取消这个消息,同时发送一个新的延时5s的消息(正常情况下消息是得不到执行的);若发生类似ANR的情况,doFrame没有被回调,这个延时5s的消息得到执行,将回调到onTimeExpire方法

    @Override
    public void onTimeExpire() {
    // maybe ANR
    if (isBackground()) {
    MatrixLog.w(TAG, "[onTimeExpire] pass this time, on Background!");
    return;
    }
    long happenedAnrTime = getMethodBeat().getCurrentDiffTime();
    MatrixLog.w(TAG, "[onTimeExpire] maybe ANR!");
    setIgnoreFrame(true);
    getMethodBeat(http://www.my516.com).lockBuffer(false);
    //有慢函数
    handleBuffer(Type.ANR, 0, getMethodBeat().getCurIndex() - 1, getMethodBeat().getBuffer(), null, Constants.DEFAULT_ANR, happenedAnrTime, -1);
    }

  • 相关阅读:
    Day 25 网络基础2
    Day 25 网络基础
    Day 24 定时任务
    Day 23 系统服务之救援模式
    Day4 总结
    Day 22 进程管理2之系统的平均负载
    【Distributed】分布式Session一致性问题
    【Distributed】分布式系统中遇到的问题
    【Redis】分布式Session
    【Zookeeper】应用场景概述
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11295909.html
Copyright © 2011-2022 走看看