Android 2

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:onCreateonStartonBind等生命周期在20s内没有处理完成发生ANR。
后台Service:onCreateonStartonBind等生命周期在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的来龙去脉。

Android 2

上一篇:leetcode 283 移动零


下一篇:JDBC:DBUtils完成 CRUD - QueryRunner实现增、删、改操作