ListView的实现离不开Adapter。可以这么理解:ListView中给出了数据来的时候,View如何实现的具体方式,相当于MVC中的V;而Adapter提供了相当于MVC中的C,指挥了ListView的数据加载等行为。
提一个问题:假设ListView中有10W个条项,那内存中会缓存10W个吗?答案当然是否定的。那么是如何实现的呢?下面这张图可以清晰地解释其中的原理:
可以看到当一个View移出可视区域的时候,设为View1,它会被标记Recycle,然后可能:
首先概括的说ListView优化分为三级缓存:
简要概括就是在getView中,如果加载过一个图片,放入Map类型的一个MemoryCache中(示例代码使用的是Collections.synchronizedMap(new LinkedHashMap<String, Bitmap>(10, 1.5f, true))来维护一个试用LRU的堆)。如果这里获取不到,根据View被Recycle之前放入的TAG中记录的uri从文件系统中读取文件缓存。如果本地都找不到,再去网络中异步加载。
这里有几个注意的优化点:
**原博文有非常好的代码示例: Listview异步加载图片之优化篇(有图有码有解释)非常值得看看。
此外Github上也有仓库:https://github.com/geniusgithub/SyncLoaderBitmapDemo
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8