依然回到这个图片来,加载这么一个列表项,用到的数据信息:缩略图(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飞起来!