2016里一些Android最佳实践列表——Opinionated

本文是一篇属于Opinionated的文章,只是表明了做者的我的观点,笔者看到Medium有两人发了都是关于最佳实践的Checklist,就把两者集成了下,而且加入了一些我的的见解,基本的知识点分布方式参考了:个人知识体系架构。仍是要强调下,本文的观点/评价只是属于我的观点,欢迎讨论。html

android-development-some-of-the-best-practices-by-Abderrazak Laanayaandroid

android-development-some-of-the-best-practices-jun-2016-edition-by-Stepan Goncharovgit

Language:基本的语法

  • 使用任何的第三方库以前都要三思而行,从笔者本身的经验里,抽象漏洞定理是一个颠仆不破的定理啊。虽然不少库宣扬的都是很是Nice,Demo也很诱人,可是你压根不知道它到底会带来怎样的Side Effect。笔者是建议若是真的打算应用某个库到正式的大型项目中,必定要好好考量下它的社区和活跃度。之后流的泪,都是当时脑子进的水。github

  • 尽可能使用那些较小的,每每只是完成单个功能的库,未来比较好替换。数据库

  • Stepan Goncharov建议使用 Kotlin,能够帮你省掉不少譬如懒加载等等JDK未提供的功能。不过笔者表示持保守态度,毕竟学习成本上来了,就像当年LinkedIn转到Scala同样,谁知道将来会咋样呢?并且Java8,9以后Java自己也在逐步完善,若是真的须要不少附加功能,我以为Lombok就不错。segmentfault

  • 给方法命名的时候尽可能清晰点,不能随意命名缓存

  • 不要使用Guava架构

  • 使用Parcel在Android中引入AutoValueapp

  • FlatBuffers是一个高效地跨平台序列化框架,而Serializable虽然方便使用,可是效率低下框架

UI

  • 使用Picasso或者Glide来做为图片容器

  • 使用Lint来辅助进行布局与层次优化,这样有助于发现冗余的布局

  • 使用styles来减小布局XML中的重复属性

  • 不要使用层次过深的ViewGroups继承

  • Launch Screen是用户看到的第一个画面,要谨慎,不过也不能在不必的时候强行加入一个Launch Screen

  • 使用ConstraintsLayout来扁平化视图层次

  • 使用数据绑定来减小UI代码的数目

  • 避免在AsyncCallback以及静态对象中引用View,而且避免将View放入没有明确的内存模式的集合中,能够考虑放到WeakHashMap中

Network

  • 不要尝试着重复造轮子,可使用Volley或者OkHTTP,能够考虑使用Retrofit做为上层封装

  • 记得监控当前链接类型,在Wifi下进行较大量的数据更新

Storage

DataBase

  • 除非确实有必要,不然不要盲目的引入数据库支持。这一点笔者也是赞同的,不少时候简单的缓存能够用SharedReference就能够了。不过反过来,若是你真的有必定的须要持久化的数据,不要犹豫,立马引入数据库的支持

  • 若是引入了DB支持,那考虑使用ORM框架的支持,避免重复造轮子

  • 关于Realm,这是一个很炫的东西,可是笔者本身老实说在Android和iOS平台引入以后,发现仍是会存在一些问题Abderrazak Laanaya对Realm是持积极态度而Stepan Goncharov是保守态度。笔者本身的感受是Realm确实很酷,可是必定要作好其引起未知Crash的心理准备

SysProc

  • 使用RxJava来代替AsyncTasks,不过对于RetroLambda的使用仍是持保留意见

  • 对于Event Bus的使用持谨慎态度,一不当心就可能把你的程序变得有些杂乱,能够考虑使用RxJava+

LocalBroadcastManager做为替代

  • 不要把太多东西塞入到Application线程中

  • 使用JobScheduler来处理长期周期化运行的无状态任务

  • 在应用程序中要注意避免Memory Leaks,不过onLowMemory()是会在整个系统的内存较低的状况下被触发,所以不能用于避免OOMs

  • 系统的30%的电量消耗用在了图片、动画等,而70%用于分析、广告、地图以及GPS

TestRelease

  • 如今的应用程序很容易突破65K的方法数量的限制,Multidexing能够帮你解决这个问题

  • 应该按照Feature打包,而不该该按照Layers打包

  • 使用Gradle以及其推荐的项目结构,而且将密码以及其余关键数据放置到gradle.properties中

  • 将应用分为多个较小灵活地模块中,这样能够尽可能保证可维护性较好、耦合度较低的CodeBase,也能够选择将小的模块发布到公开或者私有的仓库中,而后在主项目中引入。

  • 使用以下的表达式来过滤日志:

^(?!(NotificationManager|Timeline|SensorManager|Configs|libc-netbsd|art|stetho|Choreographer|CliptrayUtils|BubblePopupHelper|ViewRootImpl|libEGL|System.out|PhoneWindow))

相关文章
相关标签/搜索