Android ANR发生的原因总结和解决办法
什么是ANR?
ANR的全称是application not responding,是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。
官方指定的产生ANR一般有以下类型:
1:KeyDispatchTimeout(5秒)–主要类型
按键或触摸事件在特定时间无响应
2:BroadcastTimeout(10秒)
BroadcastReceiver在特定时间无法处理完成
3:ServiceTimeout( 20秒)–小概率类型
服务在特定的时间无法处理完成
导致ANR的根本原因
1.主线程执行了耗时操作,比如数据库操作或网络编程,I/O操作
2.其他进程(就是其他程序)占用CPU导致本进程得不到CPU时间片,比如其他进程的频繁读写操作可能会导致这个问题。
细分的话,导致ANR的原因有如下几点:
1.耗时的网络访问
2.大量的数据读写
3.数据库操作
4.硬件操作(比如camera)
5.调用thread的join()方法、sleep()方法、wait()方法或者等待线程锁的时候
6.service binder的数量达到上限
7.system server中发生WatchDog ANR
8.service忙导致超时无响应
9.其他线程持有锁,导致主线程等待超时
10.其它线程终止或崩溃导致主线程一直等待
调查并解决ANR
- 1、首先分析log
- 2、从trace.txt文件查看调用堆栈。-$ adb拉取data / anr / traces.txt。
- 3、看代码
- 4、仔细查看ANR的成因(iowait?block?memoryleak?)
如何避免ANR的发生
1.避免在主线程执行耗时操作,所有耗时操作应新开一个子线程完成,然后再在主线程更新UI。
2.BroadcastReceiver要执行耗时操作时应启动一个service,将耗时操作交给service来完成。
3.避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广 播时需要向用户展示什么,你应该使用Notification Manager来实现。
自定义控件实现(一)
自定义Toat及其弹出时间控制
效果就是实现Toast布局自定义,弹出的事件进行控制
一、先自定义布局
1 | Toast toast = Toast.makeText(mContext, str, Toast. LENGTH_SHORT); |
二、自定义弹出时间
1 | /** |
就是那么简单,利用Timer和schedule实现事件监听,控制toast的弹出时间。
Monkey自动化压力测试
Linux命令学习
远程管理命令
关机/重启
序号 | 命令 | 对应英文 | 作用 |
---|---|---|---|
01 | shutdown 选项 时间 | shutdown | 关机/重新启动 |
- shutdown 命令可以安全 关闭 或 重启系统
选项 | 含义 |
---|---|
-r | 重新启动 |
提示:
- 不指定选项和参数,默认表示 1 分钟后关闭电脑
- 远程维护服务器时,最好不要关闭系统,而是应该重启系统
1 |
ssh客户端的简单实用
ssh [-p port] user@remote
如果服务器端没有设置账号密码,或者是无密码登录,直接写ssh -p 22 192.168.177.156
或ssh -p 228 mark@192.168.177.156
关于ssh配置方法:
ubuntu下默认是不允许root通过密码的方式通过ssh远程登录服务器的,可以通过在
1 | #增加以下配置允许通过ssh登录 |
即可通过ssh的root用户登录服务器了。
下面说下如何修改root密码
1 | Enter new UNIX password: |
此时若想验证看root密码是否更改成功,可以通过如下命令
1 | su - root |
安全码SHA1如何获取
Android动态更换APP图标及名称
实现之前觉得万分难,我查阅了很多博客.
报错—–应用未安装
Stop,停下来我先抽支烟,喝杯茶,仔细看看别人的介绍。再次感谢这个博主的博客倚栏静望
android:duplicateParentState属性解释
android:duplicateParentState指的是当前控件是否跟随父控件的(点击、焦点等)状态
例:假设一Layout有两子View,对Layout进行监听点击事件;子ViewA一个设置duplicateParentState为true,子ViewB设置为false,当点击Layout后,子ViewA的点击态背景变色成功,子ViewB背景态变色无效,因为点击事件被Layout捕获。