4、view.post()
参考:https://www.jianshu.com/p/ea464eb15436
参考: https://www.ctolib.com/topics-82324.html
最后的结论, 调用View.post()可以保证指定方法的执行是在之前调用的方法处理完成之后的 而不仅仅是方法调用已经返回。
另外提醒一下,在onCreate中mAttachInfo其实是空值,post方法会走向另一个分支。
basic knowledge:
Android中所有的视图都是通过Window来呈现的,不管是Activity、Dialog还是Toast和Snackbar,他们的视图其实都是附着于Window,所以管理View的最终是Wondow。查看源码,我们发现attachinfo的赋值只有一处:dispatchAttachedToWindow方法。也就是说,View在和Window连接的时候,得到了一系列的信息,其中就包括对系统级的Handler的引用。所以调用view的post方法,其实就是发送了一个任务到MessageQueue的队尾。前面也说了,由于Android的消息驱动机制,View的layout,draw等过程都有涉及。因此不仅是View的初始化,你对View做调整可见性,背景图等操作最后都有涉及到异步消息机制, 该方法返回了,但该方法却不一定已经执行成功 大家可以到View类的源码中查看这几个方法。
=================================
3、Android Log:参考https://www.jianshu.com/p/c781f77391b2
android.util.Log常用的方法有以下5个:
Log.v() --> VERBOSE
Log.d() --> DEBUG
Log.i() --> INFO
Log.w() -->WARN
Log.e() -->ERROR
1、Log.v 的调试颜色为黑色的,任何消息都会输出,这里的v代表verbose啰嗦的意思,平时使用就是Log.v("","");
2、Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择.
3、Log.i的输出为绿色,一般提示性的消息information,它不会输出Log.v和Log.d的信息,但会显示i、w和e的信息
4、Log.w的意思为橙色,可以看作为warning警告,一般需要我们注意优化Android代码,同时选择它后还会输出Log.e的信息。
5、Log.e为红色,可以想到error错误,这里仅显示红色的错误信息,这些错误就需要我们认真的分析,查看栈的信息了。
注意:不同的打印方法在使用时都是某个方法带上(String tag, String msg)参数,tag表示的是打印信息的标签,msg表示的是需要打印的信息。
Log.v("----------logv","This is Verbose.");
Log.d("----------logd","This is Debug.");
Log.i("----------logt","This is Information");
Log.w("----------logw","This is Warnning.");
Log.e("----------loge","This is Error.");
2、理解 Activity.runOnUiThread
在开发 Android 应用的时候我们总是要记住应用主线程。
主线程非常繁忙,因为它要处理绘制UI,响应用户的交互,默认情况下执行我们写下的大部分代码。
好的开发者知道他/她需要将重负荷的任务移除到工作线程避免主线程阻塞,同时获得更流畅的用户体验,避免ANR的发生。
但是,当需要更新UI的时候我们需要“返回”到主线程,因为只有它才可以更新应用 UI。
最常用的方式是调用 Activity 的 runOnUiThread()
方法:
runOnUiThread(new Runnable() { void run() { // Do stuff… } });
这样就可以神奇的将 Runnable 任务放到主线程中执行。
=================================
1、Android ANR日志分析指南 :参考https://zhuanlan.zhihu.com/p/50107397
1)定义: ANR(Application Not Responding)
应用程序无响应,如果你应用程序在UI线程被阻塞太长时间,就会出现ANR,通常出现ANR,系统会弹出一个提示提示框,让用户知道,该程序正在被阻塞,是否继续等待还是关闭。
2)类型:
出现ANR的一般有以下几种类型:
1:KeyDispatchTimeout(常见)
input事件在5S
内没有处理完成发生了ANR。
logcat日志关键字:Input event dispatching timed out
2:BroadcastTimeout
前台Broadcast:onReceiver在10S
内没有处理完成发生ANR。
后台Broadcast:onReceiver在60s
内没有处理完成发生ANR。
logcat日志关键字:Timeout of broadcast BroadcastRecord
3:ServiceTimeout
前台Service:onCreate
,onStart
,onBind
等生命周期在20s
内没有处理完成发生ANR。
后台Service:onCreate
,onStart
,onBind
等生命周期在200s
内没有处理完成发生ANR
logcat日志关键字:Timeout executing service
4:ContentProviderTimeout
ContentProvider 在10S
内没有处理完成发生ANR。 logcat日志关键字:timeout publishing content providers
ANR出现的原因
1:主线程频繁进行耗时的IO操作:如数据库读写
2:多线程操作的死锁,主线程被block;
3:主线程被Binder 对端block;
4:System Server
中WatchDog出现ANR;
5:service binder
的连接达到上线无法和和System Server通信
6:系统资源已耗尽(管道、CPU、IO)
总结一下这分析流程:首先我们搜索am_anr
,找到出现ANR的时间点、进程PID、ANR类型、然后再找搜索PID
,找前5秒左右的日志。过滤ANR IN 查看CPU信息,接着查看traces.txt
,找到java的堆栈信息定位代码位置,最后查看源码,分析与解决问题。这个过程基本能找到发生ANR的来龙去脉。