1、Android AOP面向切面设计编程
2、hugo库
Jake大神的项目,使用仅需在方法上加 @DebugLog
@DebugLogpublic 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
来源:
调用到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@Overridepublic 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,在其中配置提示卡顿最大时间。