博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1:AOP、hugo日志库、Android Profiler、Fragment#onActivityResult调用原理、BlockCanary检测UI卡顿...
阅读量:6808 次
发布时间:2019-06-26

本文共 2261 字,大约阅读时间需要 7 分钟。

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

转载地址:http://zgtwl.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
摩游世纪CEO宋啸飞:Html5增长趋势已可见
查看>>
react学习笔记10:显示隐藏效果和tab切换效果
查看>>
i386 Linux 系统调用
查看>>
JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
查看>>
文字服务和输入语言检测到不兼容的键盘驱动程序该对话框已被停用!解决方法...
查看>>
多路复用输入/输出 ---- select
查看>>
Mysql 基本命令
查看>>
我的友情链接
查看>>
storm问题汇总
查看>>
我选择 wxWidgets 而不是 Qt 作为图形用户界面框架的一些想法
查看>>
续订Exchange 2010 Edge SMTP证书
查看>>
spring mvc+myibatis项目大致框架-spring mvc wendang
查看>>
Usage of #pragma
查看>>
一些前端框架
查看>>
我的友情链接
查看>>
知识管理是一门很深的学问
查看>>
DHCP服务在企业网络中的应用
查看>>
go语言实现udp客户端/服务端
查看>>
lua 读取lua文件
查看>>