Android新项目搭建(持续更新中)

之前项目的框架好久没有更新了,想重新搭建一个,顺便整理一下使用到的技术。

1、设计规范

android.support.design:28 

dedign出来好多年了,除了有的项目中偶尔用了一点,还没有真正使用,准备在这个demo中全面使用。

这篇文章收集了很多相关的文档,https://www.jianshu.com/p/040bd4c50eef

十款 Material Design 风格的 Android 开源项目

ps: Material Design 过时了??

在github上有很多相关的开源项目,不过貌似大部分都2-3年没有维护了,也看到有的文章提出了Material Design 的各种问题,现在推广的不是很好。

问题确实是存在的,但是对于一个测试用的demo来说,相关的设计效果和动画效果还是很好的,所以还是用一下吧。

2、使用的代码阿里的规范 

可以在androidStudio中设置规范检查 。具体配置方法可以参考这篇文档   https://www.cnblogs.com/whycxb/p/9736414.html

规范的具体内容  https://blog.csdn.net/leeyhcoding/article/details/79413532

其中有几个是我自己容易犯的错

1)使用 new Thread 创建子线程。应该使用线程池

新建线程时,必须通过线程池提供(AsyncTask 或者 ThreadPoolExecutor或者其他形式自定义的线程池),不允许在应用中自行显式创建线程。 
使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。另外创建匿名线程不便于后续的资源使用分析,对性能分析等会造成困扰。 
 同时,线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 

2)使用toask.makeText 弹出吐司,应该定义一个全全局的toask对象。

这样可以避免连续显示Toast 时不能取消上一次 Toast 消息的情况(如果你有连续弹出 Toast 的情况,避免使用 Toast.makeText)

3)不要在 Android 的 Application 对象中缓存数据 

虽然在application中缓存数据很方便,但是基础组件之间的数据共享请使用 Intent 等机制,也可使用 SharedPreferences 等数据持久化机制。

4)过度使用LinearLayout

布局中不得不使用 ViewGroup 多重嵌套时,不要使用 LinearLayout 嵌套,改用 RelativeLayout,可以有效降低嵌套数。 
说明: Android 应用页面上任何一个 View 都需要经过 measure、layout、draw 三个步骤才能被正确的渲染。从 xml layout 的顶部节点开始进行 measure,每个子节点都需要向自己的父节点提供自己的尺寸来决定展示的位置,在此过程中可能还会重新measure(由此可能导致 measure 的时间消耗为原来的 2-3 倍)。节点所处位置越深,套嵌带来的 measure 越多,计算就会越费时。这就是为什么扁平的 View 结构会性能更好。同时,页面拥上的 View 越多,measure、layout、draw 所花费的时间就越久。要缩短这个时间,关键是保持 View 的树形结构尽量扁平,而且要移除所有不需要渲染的View。理想情况下,总共的 measure,layout,draw 时间应该被很好的控制在 16ms以内,以保证滑动屏幕时 UI 的流畅。要找到那些多余的 View(增加渲染延迟的 view),可以用 Android Studio Monitor里的 Hierarachy Viewer 工具,可视化的查看所有的 view。 

灵活使用布局,推荐 Merge、ViewStub 来优化布局,尽可能多的减少 UI布局层级,推荐使用 FrameLayout,LinearLayout、RelativeLayout 次之。 

5) ScrollView 包裹 ListView/GridView

 不能使用 ScrollView 包裹 ListView/GridView/ExpandableListVIew;因为这样会把 ListView 的所有 Item 都加载到内存中,要消耗巨大的内存和 cpu 去绘制图面。 
ScrollView 中嵌套 List 或 RecyclerView 的做法官方明确禁止。除了开发过程中遇到的各种视觉和交互问题,这种做法对性能也有较大损耗。ListView 等 UI 组件自身有垂直滚动功能,也没有必要在嵌套一层 ScrollView。目前为了较好的 UI 体验,更贴近 Material Design 的设计,推荐使用 NestedScrollView。

6)SharedPreference 提交数据时,尽量使用 Editor#apply() 

SharedPreference 提交数据时,尽量使用 Editor#apply() , 而非Editor#commit()。一般来讲,仅当需要确定提交结果,并据此有后续操作时,才使用 Editor#commit()。 
说明: 
SharedPreference 相关修改使用 apply 方法进行提交会先写入内存,然后异步写入磁盘,commit 方法是直接写入磁盘。如果频繁操作的话 apply 的性能会优于 commit,apply 会将最后修改内容写入磁盘。但是如果希望立刻获取存储操作的结果,并据此做相应的其他操作,应当使用 commit。

这篇文章对SharedPreference  进行了详细的分析,也提出了一些使用方面的建议  https://www.jianshu.com/p/8eb2147c328b
  

7)在 Activity 中显示对话框或弹出浮层时,尽量使用 DialogFragment,而非Dialog/AlertDialog,这样便于随Activity生命周期管理对话框/弹出浮层的生命周期。 

其实还有很多其他的问题,尤其是在安全这一块,但是在实际项目中涉及的比较少,也不是很好处理,所以不再这里体现了

 

3、butterKnifte

 guthub 地址:https://github.com/JakeWharton/butterknife

使用方法可以参考这篇文档: Android Butterknife(黄油刀) 使用方法总结  注意文章中使用的版本不是最新的。

butterknife的功能越来越多了,绑定view,绑定资源,绑定view事件,用起来还是很方便的

4、全局线程池

在阿里巴巴代码规范中,要求使用线程是代替直接new Thread,这里项目参考规范,添加了全局线程池

这篇博客对全局线程池做了详细的介绍,

Android开发-通过ExecutorService构建一个APP使用的全局线程池

线程池还是有很多坑的,还是要理解清楚了再使用,不然出问题了很难排查。

5、android 分包

项目中用的方法数很容易超过了65536 ,需要提前处理

这篇文章中有详细的说明和介绍,可以选择适合自己项目的方法去处理

https://www.cnblogs.com/chenxibobo/p/6076459.html

6、使用eventbus传递数据

android有自带的很多传递数据的方法,但是enentBus更方便,尤其是数据比较大、传输过程涉及界面比较多的时候,优势还是比较明显的。

使用方法可以参考这篇文章   EventBus 3.0使用详解

eventBus 源码分析,这篇文章讲的还是比较清晰的。

7、网络请求框架 Retrofit+RxJava+OkHttp

Retrofit+RxJava+OkHttp 这算是现在比较流行的网络请求框架了,

这篇比较了当前一些常用的请求框架,Android网络框架比较   分析的比较简单,但是很直观。

具体的使用需要考虑项目本身的需求,这个教程写的还比较详细 

【Android】RxJava2+Retrofit2+OkHttp3的基础、封装和项目中的使用

之前项目中使用的rxjava 是1.0版本的,现在升级到2.10了,有些语法发生了变化:RxJava2 的讲解  RxJava2 只看这一篇文章就够了

8、图片展示框架 

之前项目中用的图片展示框架是ImageLoader,这是一个很好用的框架,但是也很老了,而且不支持gif,现在流行的是Picasso和Glide,查找了一些 文档,做了对比,最后决定用glide。

框架之间的对比  可以参考

https://blog.csdn.net/u013134722/article/details/56676078

https://blog.csdn.net/coderLei/article/details/80831339

glide的使用可以参考Android图片加载框架最全解析(八),带你全面了解Glide 4的用法

如果想了解glide的更多细节,上面的文章是一个系列,对glide有详细全面的介绍

9、 android 性能优化

在想开发过程中需要注意性能问题

 内存溢出检查

https://github.com/LuckSiege/PictureSelector

这个在开发和测试过程中还是很实用的一个功能,方便检查内存方面的问题

这篇博客介绍了一些源码:https://cloud.tencent.com/developer/article/1169327

这篇博客介绍了常用的功能使用:https://blog.csdn.net/weixin_42336002/article/details/80610354

ps:2.0 版本出来,尝试升级了,但是报错了,尝试修改了一下,还是失败,所以暂时没有使用。

界面布局卡顿检查

https://github.com/markzhai/AndroidPerformanceMonitor

网上关于AndroidPerformanceMonitor具体使用的文章不多, 这篇文章对其做了一些说明 http://blog.zhaiyifan.cn/2016/01/16/BlockCanaryTransparentPerformanceMonitor/

网上关于性能优化的博客很多,这个系列说的比较清楚,可以作为参考。

Android性能优化(一)之启动加速35%

Android性能优化(二)之布局优化面面观

Android性能优化(三)之内存管理

Android性能优化(四)之内存优化实战

Android性能优化(五)之细说Bitmap

Android性能优化(六)之卡顿那些事

Android性能优化(七)之你真的理解ANR吗?

Android性能优化(八)之网络优化

Android性能优化(九)之不可忽视的电量

Android性能优化(十)之App瘦身攻略

Android性能优化(十一)之正确的异步姿势

Android性能优化(十二)之我为什么写性能优化

ps:关于布局有化的问题,减少布局文件的层级和view的数量是重要的部分,ConstraintLayout是个不错的选择。

https://www.jianshu.com/p/17ec9bd6ca8a

 

10、使用的第三方开源控件

①图片选择

之前用的图片选择器停止维护了,后来找到一个还不错的的,虽然也好久没维护了,但是初步看了,还是比较好用的

https://github.com/LuckSiege/PictureSelector

这里遇到一个坑,项目中用的是glide 4.9 但是PictureSelector 用的是4.5,结果冲突了,把项目中的glide版本改为4.5就ok了。。。

②侧滑菜单

一个动画效果不错的侧滑菜单

https://github.com/yarolegovich/SlidingRootNav

③界面底部切换按钮

功能很全面(提示红点,动态图标变化、中间突出按钮、点击动画效果),使用也很容易,

https://github.com/peng8350/JPTabBar/blob/master/README_CN.md

④ ui解决方案

一个Android原生UI框架

https://github.com/xuexiangjys/XUI

可以根据需要引入相关的控件,有很多常用的样式和功能,但是demo里的东西太多了,有点杂,涉及了很多作者自己的和他引入别人的开源控件。

④ 版本更新

封装了完整的版本检查更新的操作

https://github.com/xuexiangjys/XUpdate

⑤封装的WebView

AgentWeb

https://github.com/Justson/AgentWeb

⑥常用工具类

其实工具类大部分人都会自己写,但是能整理一下也是极好的

https://github.com/xuexiangjys/XUtil

⑦腾讯bugly

 其实在很多加固工具中也有bug上报和管理功能,这里用腾讯的作为参考。

https://blog.csdn.net/qq_36467463/article/details/80803786  

发布了107 篇原创文章 · 获赞 178 · 访问量 87万+

猜你喜欢

转载自blog.csdn.net/bihansheng2010/article/details/89450452