1、Android AOP面向切面设计编程
juejin.im/post/5a40d6… github.com/HujiangTech…
2、hugo库
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卡顿
原理:基于一个线程只有一个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,在其中配置提示卡顿最大时间。