当前位置: 首页 > 工具软件 > hugo-logging > 使用案例 >

1:AOP、hugo日志库、Android Profiler、Fragment#onActivityResult调用原理、BlockCanary检测UI卡顿...

邵伟
2023-12-01

1、Android AOP面向切面设计编程

juejin.im/post/5a40d6… github.com/HujiangTech…

2、hugo库

github.com/JakeWharton…

Jake大神的项目,使用仅需在方法上加 @DebugLog

@DebugLog
public String getName(String first, String last) {
  SystemClock.sleep(15); // Don't ever really do this!
  return first + " " + last;
}
复制代码
V/Example: ⇢ getName(first="Jake", last="Wharton")
V/Example: ⇠ getName [16ms] = "Jake Wharton"
复制代码

3、使用TraceView检测UI耗时

AS中MEMORY、CPU、NETWORK分析工具:View -> Tool Windows -> Android Profiler 选择CPU,点击旁边的开始图标,操作手机之后点击结束,即可生成TraceView文件,AS会自动打开并图形化展示

4、Fragment中直接调用startActivityForResult

来源:Fragment中调用startActivityForResult的那些坑

调用到FragmentActivity#onStartActivityFromFragment,通过key-value形式绑定requestCode和Fragment。

在Activity的onActivityResult方法中,通过requestCode获取Fragment,判断它是否存在,存在则会调用Fragment#onActivityResult方法。

因此Activity重写onActivityResult方法时,不要删除super.onActivityResult()。

如果Fragment调用getActivity().startActivityForResult(),那么Fragment中onActivityResult()并不会被调用到。

5、BlockCanary检测UI卡顿

github.com/markzhai/An…

原理:基于一个线程只有一个Looper,在主线程的mainLooper中,通过Handler#dispatchMessage执行前后时间判断UI是否卡顿。

public static void loop() {
    ...
    for (;;) {
        ...
        // This must be in a local variable, in case a UI event sets the logger
        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);
        }
        ...
    }
}
复制代码

给Looper设置Printer,重写println方法,记录时间

Looper.getMainLooper().setMessageLogging(mainLooperPrinter);
复制代码
//mainLooperPrinter
@Override
public void println(String x) {
    if (!mStartedPrinting) {
        mStartTimeMillis = System.currentTimeMillis();
        mStartThreadTimeMillis = SystemClock.currentThreadTimeMillis();
        mStartedPrinting = true;
    } else {
        final long endTime = System.currentTimeMillis();
        mStartedPrinting = false;
        if (isBlock(endTime)) {
            notifyBlockEvent(endTime);
        }
    }
}

private boolean isBlock(long endTime) {
    return endTime - mStartTimeMillis > mBlockThresholdMillis;
}
复制代码

BlockCanary使用方式: 同LeakCanary,在Application中调用一行代码即可。

BlockCanary.install(context,new AppBlockCanaryContext()).start();
复制代码

AppBlockCanaryContext类继承BlockCanaryContext,在其中配置提示卡顿最大时间。

 类似资料: