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

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,在其中配置提示卡顿最大时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值