Android ListView复杂列表优化实践

原文:Android ListView复杂列表优化实践 android



不少社交App都难免会涉及到复杂的列表元素实现,一个列表上面可能大量的图片,不定长的评论列表,给手机端的程序员带来了很多的挑战。本文就是在实现复杂的列表滑动的状况下,利用已知的优化方法指导下的一次优化实践,旨在提高ListView的滑动流畅度,为用户带来良好的体验。 git

1:设计稿:

 

这是列表中可能出现的ItemView,有两种,可是又有许多相同的地方,好比同样有点赞的图片,评论等...其中,评论和点赞的数量是可变的程序员

2:使用通常布局带来的问题?

头像表格:若是使用自带的布局LinearLayout和ImageView来完成,会致使布局比较深,并且大量的addView操做会致使列表滑动的时候卡顿。 github

评论列表:和头像表格同样,因为Item的数量是会变化的,会带上和头像表格一样的问题。 canvas

大量图片加载: 不难看出图片的数量是可观的,因为每次请求回来的内容可能有不少条,若是数据一回来就请求里面带的所有图片连接,即便使用了线程池,也会占用cpu比较长的一段时间,所以也会带来界面的不流畅问题。 缓存

3:指导优化思路:

    (1): ViewHolder模式, 重用View和减小Child View查找时间,相信你们对这个都不陌生。 多线程

    (2): 尽量减小布局层次 app

    (3): 只刷新变化的部分View 布局

    (4): 避免调用addView这样的方法 优化

    (5): 只加载当前视图须要的图片,而且在滑动列表的时候中止后台的加载线程,为UI线程空出cpu资源,在中止的时候再请求。

    (6): 首次加载图片就处理(圆角/缩放等)并缓存在本地

4:实践过程:

4.1:布局和View部分:

把【头像表格】和【评论列表】做为一个总体的自定义View来实现,右边的卡片结构基本一个RelativeLayout就能够实现了,这样整个Item就基本能够控制在3~4个层次深度上面。

【头像表格】实现注意点:

1):一开始应该先用默认头像填充,以后再图片返回的时候不要粗鲁地使用invalidate(),而是使用invalidate(Rect rect),进行局部刷新,响应点击事件更换背景时也应如此。

2):因为onMesure和onDraw的的过程是比较频繁和代价较高的,所以要尽量复用对象,如(Paint, Rect...)

【评论列表】实现要点:

  1):除了上面提到的,这里有个难点就是字符串的绘制,何时该换行?这里涉及到很是复杂的文字处理,尤为是不一样国家的不一样文字系统,幸亏,这些在Android API里面都有了相关实现,笔者是在TextView中找到的,也就是android.text.Layout 的几个实现类,笔者在这里只是使用了DynamicLayout来实现。经过这个类你能够得到字符串的高度信息(onMeasure),行数等...并且它已经实现了draw的过程,只需调整好画布的位置(canvas.translate),直接调用就能够了,很是方便。

【额外元素】

1):回到设计图上,咱们看到还有可能出现的股票信息,对于这种额外元素,<ViewStub>最适合不过了...

【ListView】的数据变化:

  1):对于整个Item的增长或者删除动做,能够调用notifyDataChanged()。

2):对于Item内部的数据变化,不要粗鲁地使用notifyDataChanged(), 而是改变产生变化的View。

4.2:图片处理部分:

笔者一开始的想法是想作到:

1): 线程池,而且能够暂停全部下载线程和恢复下载

2): 双重缓存,本地永久缓存和内存级缓存

3): 滑动时候暂停全部下载,出让cpu资源给UI线程。

在实现的过程当中,在多线程这里常常作的很差,常常出问题,很是幸运在github上找到了一个开源项目能够完美地解决上面的全部问题。如今咱们公司的Android项目全部的图片加载已经自豪地使用上了... 附上地址:Android-Universal-Image-Loader

5:调整以后的效果:

因为笔者没有保留以前的界面卡顿时候的代码,所以只能演示最后的实现效果了,不能进行先后的比较。手机是小米4,图表是Developer选项中的Profile GPU rendering中,打开后先后不断滑动的结果。这里能够看到大部分状况都能在绿线下,说明总体的体验仍是很是流畅的。

喜欢炒股的朋友也能够进一步去下载咱们的应用:微财 , 即将在3.0版本能够体验到。

相关文章
相关标签/搜索