一些坑
在开发了几个项目之后我决定写篇文章分享一下一路走来的经验教训。
- 在使用任何第三方库之前都要三思,这件事非常严肃。
- 除非必须,不要使用数据库。
- 你可以尝试使用realm(第三方数据库),这个真的不错。
- 项目很快就会达到65k方法,真的很快。此时可以求助Multidex。
- RxJava是AsyncTask的最佳替代,而且它远不止于此。
- Retrofit是最好用的网络库。
- 不要自己写Http客户端,可以用Volley或OkHttp。
- 使用RetroLambda缩减代码。
- 我能想到人生最cool的事,就是把RxJava、Retrofit和RetroLambda绑在一起。
- EventBus挺好用,但我不会用太多,因为代码会变得很纠结。
- 通过功能分包,而不是通过层。
- 不要在UI线程中执行逻辑代码,不然可能会ANR。
- 使用Lint检查Layout层级可以帮你发现没用的View,兴许可以去掉。
- 使用Gradle以及默认项目结构。
- 把密码与敏感数据放在gradle.properties里。(译者注:或许更好的方式是把这些数据放在local.properties里,然后把这个文件加进.gitignore)
- 使用styles来避免在Layout文件中写重复代码。
- 不要让ViewGroup层级太多。(会过度绘制)
- 监控电量,充电时可以进行更多的数据更新,低电量时停止数据的自动更新。
- 可以尝试JobScheduler。
- 当系统缺少内存(而不是应用缺少内存)时,系统会调用onLowMemory()方法,所以OOM原则上无法避免。
- 使用Account Manager来提示登录所需的信息(用户名、邮箱、密码等)。
- 给方法一个明确的命名,要能顾名思义。
- 启动界面是应用带给用户的第一体验。
- 如果不需要启动界面,那不要无故添加。
- 保持colors.xml文件短而简单,只写基本颜色就行。
- 保持dimens.xml文件简单,之定义基本常量。
- 当要时常修改一个字符串时,使用StringBuffer或StringBuilder(后者不保证线程安全)。
- 为了避免内存泄露:
- 不要在AsyncCallBack中保留View引用。
- 不要让静态对象持有View引用。
- 最好不要在集合框架中存储View,但你也可以使用WeakHashMap。
- FlatBuffers是一个高效的跨平台的序列化类库,建议使用。
- Serializable实现起来很方便,但性能是真的差。