美文网首页
性能优化套路实践 - 最近通话列表滑动流畅度例子

性能优化套路实践 - 最近通话列表滑动流畅度例子

作者: zsj1225 | 来源:发表于2017-08-02 19:45 被阅读37次

1 减少过渡绘制

Item的过度绘制

不存在过度绘制,Item的布局的也不存在过度绘制

1. 自定义 View 时重写 hasOverlappingRendering 方法返回false。

无自定义View

2 布局优化

2.1 减少布局的嵌套层级

原则:
1,用RelativeLayout减少嵌套的层级。
2,同等层级情况下可以实现的选用LinearLayout而不是RelativeLayout。

item的的布局

就一层嵌套,这样的布局也不能用LinearLyaout来布局,所以嵌套层级无需优化。

2.2 当某些UI满足某种条件才显示复杂UI就用ViewStub

无满足某种条件才显示的复杂UI。这条无需优化。

2.3 有些大像素有规律的图片用.9去代替

无大像素有规律的图片,这条无需优化。

2.4 去掉无用的UI

无无用的UI。这里无需优化。

2.5 合并布局,用TextView代替图片加文字

虽然图片加文字可以合并的,但是那个图片是自定义View,合并改变代码过多。改了也不会带来特别大的性能好处。可以忽略。

3 分析代码耗时情况

3.1

onCreateViewHolder方法

找到一个耗时函数,看他的方法内容,inflate方法占了大部分,这个是就是加载Item的布局。但是我们的布局已经改成一层嵌套了。所以这布局无法再改了。

3.2

onBindViewHolder方法

这方法里面的bindCallLogListViewHolder()方法耗时。
点bindCallLogListViewHolder方法(76序号)

bindCallLogListViewHolder方法

看得出来,前面的这三个方法耗时。那么我们一一分析这个三个方法。
先看setPhoneCallDetails,点104序号的setPhoneCallDetails方法。

setPhoneCallDetails方法

同上序号147的setPhoneCallDetails和序号161getCallDescription耗时。
一直往下跟,跟到join这个方法。


join方法

BidiFormatter.unicodeWrap耗时。

代码是这样的:


join方法

得知道这个代码的作用是干啥的?

BidiFormatter.unicodeWrap的作用

那不是说不能改了吗?
当然不是了。
TextView有一个属性可以专门解决这种问题:
setTextDirection(View.TEXT_DIRECTION_LTR)

所以上述代码就可以改成:

image.png image.png

给Textiview设置setTextDirection(View.TEXT_DIRECTION_LTR)这个属性。

改好运行修改后的代码。生成.TraceView对比修改的结果。

搜索join看优化成果,

join优化前 join优化后

是不是没有了BidiFormatter.unicodeWrap的耗时了吗?这不是废话吗?注销掉了肯定会没有了呢?至于数据为什么好像比优化前要跟耗时。这是traceView检查问题,和代码的每次的执行时间有不一样的。误差范围内。

总结: 根据Incl Real Time进行从耗时时间从长到短排序,然后搜索关键字符串,找属于自己的代码的耗时方法,再看代码分析,优化即可。

相关文章

网友评论

      本文标题:性能优化套路实践 - 最近通话列表滑动流畅度例子

      本文链接:https://www.haomeiwen.com/subject/tnmelxtx.html