写在前面的话:
本人学习Android一年有余,自我评估对于Activity的基础知识运用还是比较到位,但就是最近开发项目时,竟被一个问题折磨了整整一天,反复调试发现时好时坏,一度怀疑稳定性的问题。找不到原因抓狂时,我也始终相信,代码比人要理智,运行崩溃总是有原因的,只是我暂时不知道而已......
一.问题代码业务逻辑简介
通过蓝牙串口接收单片机发来的数据,经过解析计算后数据要从Service传到Activity,并通知Activity里面的坐标系Coordinates重绘,重绘的消息通知代码为:
Handler的代码为:
就是这么简单的一个重绘,顺带设置一下TextView的值,结果老师运行崩溃,报错:
二.问题分析与原因查找
事实上,通过一般的端点分析是可以定位到出错的代码行的。但问题就在于,程序时好时坏。某一下,又一路通畅,一点问题没有;某一下,就运行崩溃,程序停止,这时好时坏地就把我给搅糊涂了。由于我重绘时连着有两次重绘,一次是参比点的重绘,一次是数据点的重绘,代码如下:
所以,我就纠结于这两次重绘的问题,一块一块地打断点来回调试,发现还是时好时坏。
由于该项目涵接单片机蓝牙+算法的业务,因此调试一次要花费10分钟,时间就这么10分钟、10分钟地流走啦。。。
三.灵光一现,问题锁定啦
正百思不得其解之际,突然感觉脑子里灵光一现,是否是TextView控件未实例化呀???
前段时间,朋友开发遇到类似的问题,说总报错找不到资源,我告诉他试试看是不是实例化对应错了位置,他一查果然是这样的。可是,我的不是啊,我很确定我的控件是实例化了的,千真万确!!!
不过,经过排查,真的是这两个家伙的问题,对,就是下面这两个。。。。
tvDetailMax
tvDetailMin
为什么呢?
因为我的这两个控件是在子布局里面实例化的,也就是说在Activity里点击按钮,会出现这个子布局,随机对各控件赋值,而这俩货就是在该子布局里面的。
1.我在还未重绘前,若点击过该按钮,即子布局被实例化过一次后,再重绘——完全OK
2.but,若我不做任何操作,直接由程序重绘,就出现上面的崩溃错误啦
这就是前面所呈现出来的问题,时好时坏——因为在测试过程中,我无意识地随机进行了按钮点击操作。导致没有点击重绘时,由于TextView控件并未实例化,因此,就出错啦。
四.问题解决——代码修改
怎么办?实例化还是要在按钮下的子布局里面去实现的,只得修改代码为:
五.总结
我自己得出一个结论,永远都别忽视细节,不管多厉害的人,小错误偶尔难免也会犯,所以,查找问题时请多方面排查!多多积累问题吧,经验多了自然就敏感了,编程有时也是要靠直觉的,嘿嘿,也可以叫它灵感!