一、ListView加载图片
二、ListView自身优化
1》当快速滑动时不去加载图片。
通过listview中传入的参数去判断滑动的速度。如果速度达到一个临界值,是不需要去加载图片的;如果没有则需要去加载图片。
慢的话:
有个延迟加载数据的方法,在API的demo中。
要是让ListView滚动速度快的话,你可以这样告诉他:
让他的手指在屏幕上迅速的上下滑动,当他的手指移动速度达到100px/0.1秒后,就可以看到快速滑动的效果了!~
方案四:
ListView的右边滚动滑块启用方法?很多开发者不知道ListView列表控件的快速滚动滑块是如何启用的,其实辅助滚动滑块只需要一行代码就可以搞定,如果你使用XML布局只需要在ListView节点中加入 android:fastScrollEnabled="true" 这个属性即可,而对于Java代码可以通过myListView.setFastScrollEnabled(true); 来控制启用,参数false为隐藏。还有一点就是当你的滚动内容较小,不到当前ListView的3个屏幕高度时则不会出现这个快速滚动滑块,该方法是AbsListView的基础方法,可以在ListView或GridView等子类中使用快速滚动辅助。
三、加载的图片优化
系统应用有一个Gallery,Gallery对图片的大小进行了优化.
方法一、
①在加载图片之前使用BitmapFactory.Options options = new BitmapFactory.Options();
//将options.inJustDecodeBounds设置为true;这样不会去解析图片,只解析边界,即宽高
②BitmapFactory.decodeFile(jpgPath, options);
③读出图片的真实高度
④如果图片的真实宽高都小于设置的临界值,则需要使用真实的宽高
方法二、
方法一在一定程度上牺牲的图片的质量,但可以避免OOM Error。
当Android设备中较大图片时,可以创建一个临时空间,将载入的资源放到临时空间。
bfOptions.inTempStorage=newbyte[12*1024];//创建了一个12kbde临时空间
一般我们喜欢在静态方法中static {
mOptions.inDither = false;// 设置为false,将不考虑图片的抖动值,这会减少图片的内存占用
mOptions.inPurgeable = true;// 设置为ture,表示允许系统在内存不足时,删除bitmap的数组。
mOptions.inInputShareable = true;// 和inPurgeable配合使用,如果inPurgeable是false,那么该参数将被忽略,表示是否对bitmap的数组进行共享
}
方法三、我们可以再getView方法中给ImageView设置图片时,使用LruCache先到imageUrl存入缓存,同时在listview中设置bitmap,如果通过imageCache取不到bitmap就从新从网络获取图片。LRUCache当ListView加载了某些图片被系统回收以后,用户再次滑入屏幕这种情况。这时重新去加载一遍刚刚加载过的图片无疑使性能的瓶颈,这时我们可以使用LRUCache对图片进行缓存或者其他优化。LruCache类在Android-support-v4的包中提供,这个类非常适合缓存图片,他的主要算法原理是把最近使用的对象用强引用存储在LinkedHashMap中,并且把最近最少使用的对象在缓存值达到设定值之前从内存中移除。如何选择合适的缓存大小给LruCache?1》你的设备可以为每一个应用程序分配多大的内存?2》设备屏幕上一次最多能显示多少张图片?有多少图片需要进行预加载,因为有可能很快也会显示在屏幕上?3》图片的尺寸和大小,还有每张图片占据多少内存空间?4》图片被访问的频率有多高?
对LruCache的使用案例://获取到可用内存的最大值,使用内存超出这个值会引起OutOfMemory异常。//LruCache通过构造函数传入缓存值,以kb为单位int maxMemory = (int) (Runtime.getRuntime.maxMemory()/1024);//使用最大可用内存值的1/8作为缓存的大小。//复写LruCache中的sizeOf()方法 默认返回图片数量//当向 ImageView 中加载一张图片时,首先会在 LruCache 的缓存中进行检查。如果找到了相应的键值,则会立刻更新ImageView ,否则开启一个后台线程来加载这张图片。
四、特殊复杂布局的特殊处理
五、ImageLoad加载
/*内存加载图片*/
public static Drawable loadFromMemory(String url){
Drawable drawable = mDrawableCache.get(url);
if(drawable!=null){
//从内存中获取到了,需要重新放到内存队列的最后,以便满足LRC
//一般缓存算法有两种,第一是LFU,按使用次数判定删除优先级,使用次数最少的最先删除
//还有一个就是LRC,就是按最后使用时间来判定删除的优先级,最后使用时间越早最先删除
mKeyCache.remove(url);
mDrawableCache.remove(url);
//如果大于等于100张,或者图片的总大小大于应用总内存的四分之一先删除前面的
}
}
// mKeyCache.add(url);//添加 mDrawableCache.put(url,drawable); mTotalSize += DrawableUtils.getDrawableSize(drawable); }}
243



被折叠的 条评论
为什么被折叠?



