android ListView性能优化之路 -- 高级

依然回到这个图片来,加载这么一个列表项,用到的数据信息:缩略图(url),标题(string),星级(float),文件大小(long),下载次数(long),按钮图标(int_id),按钮提示(string)。

优化高级:数据缓存级优化

其实,在初级优化的时候,基本优化是使用视图模板缓存,是google实现并提倡的。缓存,使用较小的内存代价换取大量的重复运算开销。

缩略图缓存,基本是每一个好项目应有基础的技术或者功能,减少加载时间和效率,减少流量。图片基本是不会变更的,只要加载一次,便可以重复使用。这里就不着重讲了。

基础数据缓存,当很多数据需要重复转换,并且转换效率不理想时,也许,你曾不屑于注意的地方却有惊人的优化空间。比如long转string,当需要追加字符时,当需要控制小数位数时,当需要动态调整长度时,而且将可能无数次重复时,基础缓存,变得有必要。

状态缓存,在不同的状态选择不同的图片和文字,当状态多而复杂的时候,你还想每次去跑一次繁杂而无意义的判断选择逻辑吗?选择缓存吧,不需要动的时候,不动如山。

 

总结,一句话:系统刷新一个item极致时间是什么,imageview.set(image), textview.set(string), ....

 

public class ViewDataHolder {
    public int position;    
    public int itemTypeId;
    public String appIcon;
    public String appName;
    public String appOptText;
    public int appOptDrawableId;
    public String appSize;
    public float appRating;
    public String appDlCount;
}

 

public void updateUI(ViewDataHolder dataHolder) {        
    appIcon.getThumbnail(dataHolder.appIcon);
    appName.setText(dataHolder.appName);
    appRating.setRating(dataHolder.appRating);
    appSize.setText(dataHolder.appSize);
    appDlCount.setText(dataHolder.appDlCount);
    appOpt.setCompoundDrawablesWithIntrinsicBounds(0, dataHolder.appOptDrawableId, 0, 0);
    appOpt.setText(dataHolder.appOptText);
}    

极致缓存带来的极致简洁而高效的代码。

 也许,到这里,依然有人觉得数据缓存带来的效率差强人意,那么,你想象一下这个图:

当一个需要频繁刷新数据的界面碰上国产的500元山寨屌丝机的时候,悲剧就产生了。

数据缓存的基本做法是:

1、拿到数据的时候,先初始化缓存,再更新界面。批量任务,如第n屏加载时,这时应该有个loading,那就让loading再持续0.1S吧。

2、数据变更的时候,先更新缓存,再更新界面。一次操作,一劳永逸。

3、数据频繁变更的时候,先更新缓存,考虑延迟加载(数据当前不是很重要),或者不更新(数据不在当前显示范围)。

 

好吧,ListView性能优化之路基本到这里,让你的ListView飞起来!

posted on 2013-07-17 22:56  asi24  阅读(533)  评论(0编辑  收藏  举报