Android开发注意事项(时刻谨记)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wdx_1136346879/article/details/85320439

异常处理
1、 空指针异常。对象都有生命周期,使用一个对象时需要对其状态进行判断。
2、 越界异常。
3、 OOM。
4、 BadTokenException。
体验优化
1、 页面加载速度。
2、 页面响应速度。
测试
1、 测试Log使用特有的格式,方便删除
2、 测试代码通过@TODO 标记,测试后删除
3、 提交代码前通过Lint检查代码规范
工具
好几种公具检测内存,BUg等

异常处理
1、 空指针异常。对象都有生命周期,使用一个对象时需要对其状态进行判断。
示例1:一个Activity的成员变量的生命周期应该伴随页面生命周期,如果在页面未创建或者已经销毁的情况下需要使用成员变量就要思考该成员变量是否为空;
示例2:对接口数据对象的使用要遵守不信任原则;
示例3:一个类的方法如果需要参数需要考虑使用场景,是否可被外部调用,参数是否可为Null,Null参数如何处理等,可添加@NotNull加以控制。
2、 越界异常。数组、List获取数据前一定要做越界检查,对字符串操作,分割、截取、替换等也需要判断是否超出字符串长度。
3、 OOM。
示例1:静态变量。除非判断出必要使用静态变量否则不建议使用。如果使用静态变量需注意其生命周期,周期较长的静态变量考虑用其他方式存储或者需要更严格的生命周期管理,需要及时置空。
示例2:单例。这是静态变量的特殊形式,也就是生命周期严格管理的对象。单例对象不可持有生命周期短与自身的成员变量,比如,持有activity、view等。
示例3:大内存对象。图片、线程、流等。关于图片这里需要注意的本地通过resid加载的资源大图,这种图片不被第三方加载库监控容易引起内存不受控制的增长,如果手动释放这类图需要注意是否可能通过resid在此使用,此时系统可能不会重新加载图片引起异常。色彩单一的图考虑用绘制替换图片。工作线程要使用线程池统一管理,使用timer执行的任务要注意及时终止,AsyncTask不要过多使用。流通过finally必须控制关闭。
示例4:注册的监控、回调、异步任务等事件通知功能需要及时注销。比如activity动态注册的BroadcastReceiver,页面退出后必须要注销。Handler执行的任务也要在页面退出后取消。
4、 BadTokenException。对于页面的异步任务,待任务结束后必须判断当前页面状态是否可进行后续操作。比如接口调用、异步线程、事件通知等
体验优化
1、 页面加载速度。
示例1:页面启动过程不能添加耗时操作,比如数据库读取、sp操作、大量数值计算等;
示例2:懒加载原则。必要的耗时操作要用懒加载或者异步的方式进行。不被立即显示的页面元素是否可以延迟加载,比如viewpager管理多个fragmeng不要一次加载所有fragment。
示例3:页面嵌套层级要越少越好
2、 页面响应速度。
示例1:点击事件的动画效果
示例2:页面滚动操作。滚动过程不要进行耗时操作。
示例3:过度绘制会影响页面每一帧的响应速度,所以避免过度绘制是加快响应速度的最有效的方法。检查每一层页面的背景,不被显示或者被覆盖的元素不要设置背景。点击效果和背景考虑是否可以合并设置。

测试
1、 测试Log使用特有的格式,方便删除
2、 测试代码通过@TODO 标记,测试后删除
3、 提交代码前通过Lint检查代码规范

工具
Hierarchy Viewer:提供了一个可视化的界面来观测布局的层级, 让我们可以优化布局层。
Leakcanary:Android和Java的内存泄露检测库。
TraceView:分析方法调用栈以及其执行时间, 优化方法执行.
Hugo:打印方法的执行时间

猜你喜欢

转载自blog.csdn.net/wdx_1136346879/article/details/85320439