b、对于较为复杂的页面,个人建议不要写在一个activity中,建议使用几个fragment进行组装,这样一来,module的变更可以只刷新某一个具体的fragment,而不用整个页面都走刷新逻辑。但是问题来了,fragment之间如何共享数据呢?好,看我怎么操作。
9.pngActivity将数据这部分抽象成一个LiveData,交个LiveDataManger数据进行管理,然后各个Fragment通过Activity的这个context从LiveDataManger中拿到LiveData,进行操作,通知activity数据变更等等。哈哈,你没有看错,这个确实和Google的那个LiveData有点像,当然,如果你想使用Google的那个,也自然没问题,只不过,这个是简化版的。项目的引入
'com.tencent.tip:simple_live_data:1.0.1-SNAPSHOT'
10、动画优化
这里主要是想说使用硬件加速来做优化,不过要注意,动画做完之后,关闭硬件加速,因为开启硬件加速本身就是一种消耗。下面有一幅图,第二幅对比第一幅是说开启硬件加速和没开启的时候做动画的效果对比,可以看到开启后的渲染速度明显快不少,开启硬件加速就一定万事大吉么?第三幅图实际上就说明,如果你的这个view不断的失效的话,也会出现性能问题,第三图中可以看到蓝色的部曲线图有了一定的起色,这说明,displaylist不断的失效并重现创建,如果你想了解的更加详细,可以查看这里
10.png// Set the layer type to hardwaremyView.setLayerType(View.LAYER_TYPE_HARDWARE, null);// Setup the animationObjectAnimator animator = ObjectAnimator.ofFloat(myView,View.TRANSLATION_X, 150);// Add a listener that does cleanupanimator.addListener(new AnimatorListenerAdapter() {undefined @Override public void onAnimationEnd(Animator animation) { myView.setLayerType(View.LAYER_TYPE_NONE, null); } });
11耗电优化
这里仅仅只是建议;
a、在定位精度要求不高的情况下,使用wifi或移动网络进行定位,没有必要开启GPS定位。
b、先验证网络的可用性,在发送网络请求,比如,当用户处于2G状态下,而此时的操作是查看一张大图,下载下来可能都200多K甚至更大,我们没必要去发送这个请求,让用户一直等待那个菊花吧。
四 接下来的一些内容就比较轻松了,是关于一些代码的建议
11.png这里不一一细讲了,仅仅挑标记的部分说下。
pb->model这里的优化就不在赘述,前面有讲如何优化。
然后建议使用SparseArray代替HashMap,这里是Google建议的,因为SparseArray比HashMap更省内存,在某些条件下性能更好,主要是因为它避免了对key的自动装箱比如(int转为Integer类型),它内部则是通过两个数组来进行数据存储的,一个存储key,另外一个存储value,为了优化性能,它内部对数据还采取了压缩的方式来表示稀疏数组的数据,从而节约内存空间。
不到不得已,不要使用wrap_content,,推荐使用match_parent,或者固定尺寸,配合gravity="center",哈哈,你应该懂了的。
那么为什么说这样会比较好。
因为 在测量过程中,match_parent和固定宽高度对应EXACTLY ,而wrap_content对应AT_MOST,这两者对比AT_MOST耗时较多。
五 总结
这是以上关于我在工作中遇到的性能问题的及处理的一些总结,性能优化设计的方方面面实在是太多太多,本文不可能将全部的性能问题全部总结的清清楚楚,或许还多多少少存在一些纰漏之处,有不对的地方欢迎指出补充。
参考资料
等,具体详见原文。
问答
如何发布节点应用程序?
相关阅读
游戏人工智能 读书笔记 (二) 游戏人工智能简史
游戏人工智能 读书笔记(一)前言与介绍
低于0.01%的极致Crash率是怎么做到的?
云学院 · 课程推荐 | 知乎KOL,与你分享机器学习中如何做选择