android小细节

1、资源包图片尽量控制在50k以内,否则可能读取失败

2、资源图片建议使用png格式,此格式在android系统上支持最好。对于jpeg和gif格式的图片,在android4.0以后版本,通过系统自缩放后,无法转码为565格式,只能使用默认格式

3、adapter的数据发生变化后,必须调用notify接口通知。

4、ui界面使用的数据,不能在子线程中修改。

5、网络需要考虑中国移动互联网的特点,需要考虑2g,3g,wifi,net,wap。网络接口必须设置超时时间,否则可能造成内存泄露

6、页面退出时,与页面相关的网络请求必须关闭,否则会造成流量浪费,还会造成内存释放不及时,和网络请求回调返回时页面已经关闭,造成crash

7、页面退出时,关闭与页面相关的定时器(尤其是循环定时器)、动画等。否则会造成内存泄露或crash

8、如果页面需要复杂手势的支持,需要考虑电阻屏兼容性。

9、手机屏幕密度各不相同,尺寸也各不相同,设备独立像素(dip)也不相同,虽然大多数手机是(320*480dip)。切图标注不能标注总长或者总宽,应该标注边距,内容区自适配。

10、服务器返回的数据必须判断真伪。对于服务器返回的数据,必须保持不可信的态度,保持代码健壮性。

11、整型溢出异常。对于服务器返回的id之类的数据,如果没有特殊的含义,必须转换成string使用。

12、防止数据库死锁。多线程使用同一句柄访问。多进程使用进程通信方式访问,如:content provider

13、读写磁盘需要判断sd卡是否存在

14、android平台内存限制严格,超过上限报OOM异常,此异常无法捕获。常用内存上限有16M,32M,64M,128M等,开发具体功能一定要考虑内存占用量,及时回收,对于不同内存的手机可以采用不同的策略。

15、SharedPreferences同一key不能写不同的数据类型,否则会crash,建议对于key统一管理,下线功能的key不要删除,防止被重复使用,造成升级用户crash。

16、改造账号系统一定要关注是否会影响易平台用户,做好兼容性

17、对于使用的第三方库,做好云控制,需要通知QA同学测试云开关。调用的第三方接口,尽量尝试捕获异常,保证app不要crash

18、产出必测list,提供给QA同学,上线前必测list必须逐条回归,防止发出去的app失去控制。

19、自定义控件需要考虑生命周期,这点经常被遗漏,会造成内存泄露

20、不要过多占用rom空间缓存数据,因为rom空间相对较小,大多数app都默认安装在rom,如缓存过多数据在rom,会造成用户无法安装其他app。建议rom只缓存重要数据。

21、对于支持多皮肤的app,资源分配极端情况下会double,需要额外关注大图片的释放时机。

22、通过调整alpha值做的夜间模式效果,并不是所有手机都适合

23、调用某些系统接口,需要考虑深度定制机的修改。如拉起系统设置界面,某些定制机对系统界面的调用方法做了修改,直接按照系统方法调用会crash,应该捕获异常,如出现异常提示用户手动设置。

24、传感器的使用。因android手机硬件的多样性。传感器灵敏程度,采样频率等各不相同,需要考虑兼容性。

25、部分界面需要考虑横竖屏切换,根据具体场景,确定切换策略。

26、android虚拟键盘多样性,根据父窗口获得的键盘高度并不准确,尽量把输入窗口往上提,防止被虚拟键盘遮挡。

27、webview不支持自动检测网络切换,网络切换后需要通知webview网络已切换。

28、多线程处理容易忽略内存使用,对于使用内存较多的线程,需要app控制串行执行或者控制内存占用。如下载gif图片,如果开5个线程同时下载不同的gif图片,每个图片2M以上,会直接crash

29、重视版本兼容性问题,对于升级用户,特别是跳跃式升级用户(如从1.1直接升级到3.0),需要兼容老版本的数据,特别是数据缓存和桌面快捷方式。

30、系统的异步任务AsyncTask,如果声明了targetSdkVersion小于等于12或者minSdkVersion小于等于12,即android3.1版本以上AsyncTask的默认行为是串行。

31、图片处理之后,如果差异性不大(如缩放比例接近1.0),有可能还是返回处理之前的图片引用,如果此时释放原始图片,处理后的图片也被释放了,是recycled状态,此时再使用这张图片,会crash

32、耗内存的操作(大图片处理,webview,视频播放等等),应该提取出来,放在单独的进程中运行,防止主进程内存被耗尽而crash

33、JNI包应该编译不同处理器的so文件(主要是arm,mips,x86),防止不兼容处理器而crash。

34、资源包的raw目录是不压缩目录,一些无需压缩的文件可以放在此目录。特别是声音文件,如果再次压缩在某些机型无法播放。

35、不要过度相信后台service,在某些机型上或者某些管理软件,后台service的进程有可能被回收。

36、java.lang.Thread创建以后必须调用start(),否则内存泄露。就算Thead变量是方法里面的临时变量也必须调用start,否则就会内存泄露。 调用run方法什么的都没用,必须start方法。原因是Thread在创建时,分加入到ThreadGroup中,group是全局的,所有Thread的引用会直接保存不会被释放掉。只有start调用,系统走完自己的run回调流程,才会从group里面释放。

原文地址:https://www.cnblogs.com/xitang/p/3238424.html