Android App罕见错误和优化方案
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!
1、App如果被定义一个有参数构造函数,那么需要再定义一个无参数的,如果不则会在某些情况下初始化失败
2、include Java Exception stack in crash report 原因:webview未被destroy和置空,快进快出容易导致Crash
3、Json解析一直有反斜杠,如
"Detail": "[\"1476438611831,120.011798,30.294126,6.5461546E-4,2.9163063E-4,0.0034914017,-0.05355559,0.080890246,9.80617,-9.765625E-4,2.1362305E-4,1.8310547E-\"]"而实际上需要这种
"Detail": [ [ "1476440497243", "120.011839", "30.294298", "0.0013065673", "0.010251816", "-0.07671833", "-0.04659828", "0.06689003", "9.806312", "-5.79834E-4", "6.866455E-4", "-0.0027008057" ] ]原因:前者使用sdk本身提供的Json资源,后者使用gson提供的Json资源,如果要上传jsonArray数据只能用Gson。
默认Json使用put方法设置数据,如果值有引号则自动加上反斜杠做转译
第1张是Json直接把value以Object的方式放入LinkedHashMap,第2张是Gson把Value分类(主要对Charater即String的接口)放入LinkedTreeMap
4、ScrollView通过addView加入Lv,结果焦点到达页面底部,这是由于Lv获得焦点引起的,所以把Lv的焦点去掉即可
lv.setFocusable(false);
5、网络请求返回数据一直是回车+空格的组合数据,报错:java.lang.StringIndexOutOfBoundsException: length=0; regionStart=0; regionLength=1
原因:请求的接口没有收到数据,是请求框架自身返回的数据,所以格式不正确;很可能是内网接口用外网连接导致
6、
Error:Execution failed for task ':mergeAnzhiDebugResources'.
> Error: java.lang.RuntimeException: Crunching Cruncher img_bubble_default.9.png failed, see logs
主要原因是.9图片的长边是放内容的,小点代表拉伸的,原来的位置刚好相反,改过来就好。
7、华为手机读取文件后截取,再获得图片失败。
分析:这个错误很奇怪,以前开发中经常不会遇到,而目前相对来说,各大厂商对权限的要求越来越严格,更甚者在安装时即主动屏蔽若干权限,同时部分权限用时需要申请;说到这里你可能就明白了,这里主要是权限被剥夺的问题,要断点到出错的位置,提示赋予应用读写权限。
8、4.0以上版本,RadioGroup两个子RadioButton均处于选中状态
原因在于:设计某一个radio为true时,另外一个没有id,因此系统原因导致两个均被选中。
需要做的就是给radio设置id。
9、list不能addAll空数据,否则报空指针异常。系统层次的错误。
优化方案:
1、能用FrameLayout的,都换成这个(因为Android会对此layout进行merge操作),同时能不用layout的也尽量不用
2、纯色图片,能用xml写的,换用xml写,图片命令均以img_x_x.png
3、中文都写到string文件里,有相同中文的,去掉其中一个,命名尽量短且通用,尽量用Html的from格式和String的format格式来处理字符串,两个方法均可在CMYStringUtil方法里找到
4、上述两者不用的,你们暂时可以不处理,且命令尽量通用,如可以命名为alipay_str_finish就不命令为alipay_str_service_finish
5、文字输入框,只能输入哪些类型,做一个限制android_limit,另外,监听一下回车键,看应该跳下一行就把回车键命名为“下一行”,当前表单填完,命名为“完成”,并触发提交按钮,数据进行验证
6、Exception尽量去掉,原因是要找到错误处理掉,而非简单的加try..catch
7、写intent传递数据,对象用TransferData传递,基本数据类型用putExtra来传递,注意key都要用IConstants里的intent_key
8、方法都命名为有意义的命名,具体参考“新人必读”里的规则,以及变量名,全局、局部、静态变量等,另外不用的字段都删掉
9、findId尽量都改成getEelement,使用Ctrl+F来替换,尤其适配器里,尽量用getInflateView和getEelement来代替
10、把公用的布局或代码提出来,尽量多用include、viewStub、merge
11、有网络请求的,都要加上onRefresh方法,避免请求失败,需要重新加载,当前页面无方法
12、优化语法逻辑,全面考虑出现问题的情况,具备产品思维
读这篇文章同时也要注意一下系统升级的问题,里面同样埋有不少坑:Android高级第十一讲之不同系统间的区别
另外内存是个亘古不变的老难量,参考:Android高级之十二讲之如何降低应用内存消耗