1.UI绘制
减少UI绘制时间;
减少不必要的子控件或层级;UI的绘制流程:measure-layout-draw,measure与layout都需要for loop所有的子控件,汇集起来才能完成绘制,布局。所以子控件越多,所消耗的时间越长(inflate,layout_weight,relative,多层嵌套等),减少不必要的子控件或层级,是相当有必要的。
通过merge,viewstub这些标签来减少层级嵌套;
对于ListView、GridView而言,复用item减少inflate次数,通过setTag,getTag的viewHolder方式实现复用(holder中的控件最好reset后再赋值,避免图片文字错乱);
ViewPager同时缓存page数最好为最小值3,每个pager应该只在显示时才加载网络或数据库(UserVisibleHint=true),最好不要预加载数据;
对于下载,要控制好下载的最大任务数(平均速度慢),同时给InputStream再包一层缓冲流会更快(如BufferedInputStream)
对于图片,最好根据实际情况进行压缩,同时考虑对图片进行缓存(加载速度:内存>硬盘>网络,合理使用内存缓存)。
2.缓存
比方说,以前我们一直在用强引用,HashMap,后来我们发现占内存,我们就用软引用,弱引用来及时回收,再后来因为回收机制不可控,所以又有了lrucache,disklrucache通过算法来平衡内存与硬盘缓存。随着android版本的推进与演化,我们也应该拥抱变化。如果你的App里还有软引用,弱引用的地方,不妨再check下。
比方说网络+数据库。网络我们一般都是去主动获取,而非被动接受。那如果说数据是重复的或者未更改的呢?那我们去取一次网络数据有什么意义呢?我的解决方案是给每个activity或fragment或每个组件设置一个最大请求间隔,比如一个listview,第一次请求数据时,保存一份到数据库,并记下时间戳,当下次重新初始化时,判断是否超过最大时间间隔(如5分钟),如果没有,只加载数据库数据,不需要再做网络请求。当然,还有一些隐式的http请求框架会缓存服务器数据,在一定时间内不再请求网络,或者当服务器返回304时将之前缓存的数据直接返回。
3.网络请求
合理的缓存,控制最大请求并发量,及时取消已失效的请求,过滤重复请求,timeout时间设置,请求优先级设置等。
4.其它代码规范
你要知道for loop中不要声明临时变量,不到万不得已不要在里面写try catch。
明白垃圾回收机制,避免频繁GC,内存泄漏,OOM(有机会专门说)
合理使用数据类型,比如StringBuilder代替String,(笔试题最常见的是str+="str"中有几个对象) ,少用枚举enum,少用父类声明(List,Map) 如果你有频繁的new线程,那最好通过线程池去execute它们,减少线程创建开销。
你要知道单例的好处,并正确的使用它。
多用常量,少用显式的"action_key",并维护一个常量类,别重复声明这些常量。
如果可以,至少要弄懂设计模式中的策略模式,组合模式,装饰模式,工厂模式,观察者模式,这些能帮助你合理的解耦,即使需求频繁变更,你也不用害怕牵一发而动全身。需求变更不可怕,可怕的是没有在写代码之前做合理的设计。
网友评论