首先我一般使用的适配器是BaseAdapter,其中有两个方法最主要,分别是: getCount,getView,
在对Listview 进行优化的时候,首先使用 convertview 和viewHolder 配合进行优化,使用convertview的母的是
控件复用,从而加到减少内存的使用,使用viewHolder 的是减少findbyid 的次数.
但是在进行控件以后,在进行图片加载的时候,会出现图片错位的问题,这是因为控件里面有上次残留的图片在里面,所以我们在初始化的时候需要设置一张默认图,清楚上次残留的图片,从而避免图片错位.
 
注意: 在进行图片加载的时候一般会造成 OOM(内存溢出),这个时候我们需要用到三级缓存策略,来进行处理,
首先三级缓存分别是:
1:强引用(Lrucache)
2:软引用(SoftRenfence)
3:SD卡(现在被 DisKLrucache)
 
首先当我们需要加载图片的时候:
首先从强引用里面找,如果强引用没有,就从软引用里面找,如果软引用没有就从SD卡里面找,如果SD卡没有就从网络加载,通过加载请求到的图片存入到强引用(Lrucache)里面.
第二:强引用一般取内存的四分之一,当强引用满了以后,就通过Lrucache 算法讲部分图片删除,同时存入到软引用里面,当软引用满了,就将部分图片存入到SD卡里面,当SD卡满了,就将一半的删除,(删除的时候根据使用日期排序),
 
注意:强引用是不能被垃圾回收机制回收的,软引用是可以随时被垃圾回收机制回收的.
:一半情况下我们加载的图片的 url,是服务器经过二次采样以后的url,只有当点击看大图的时候才加载原图.
:无论在强引用,软引用还是SD卡我们存图片的时候都是以键值对的形式存的,他的键就是url,一般情况下使用MD5对URL进行加密,这样做的目的是为了避免URL 里面有非法字符.
 
二次采样:
 
注意:二次采样分两部进行,首先第一步我们需要获取图片的宽和高,同时获取到需要采样后的宽和高,通过宽和高计算出我们需要的采样比,第二步:通过采样比让我们的图片真正实现采样缩放.
 
案例如下:
 
第一步:
假如说我有一张图片是200*200,那么我想把这张图片的缩略图显示在一个50*50的ImageView上,那我的压缩比例应该为4,(这就是我们第一步的操作了,我先加载图片的边界到内存中,这个加载操作并不会耗费多少内存)
 
第二步:
在第一次采样的基础上,我来进行二次采样。二次采样的时候,我把第一次采样后算出来的结果作为一个参数传递给第BitmapFactory,这样在加载图片的时候系统就不会将整张图片加载进来了,而是只会加载该图片的一张缩略图进来,这样不仅提高了加载速率,而且也极大的节省了内存,而且对于用户来说,他也不会有视觉上的差异
 
具体代码如何实现:
 
第一次采样:首先获取new BitmapFactory.Options()获取option对象, inJustDecodeBounds
设置为true只会加载图片的边框进来,并不会加载图片具体的像素点,通过BitmapFactory.decodeFile(filePath, options);来进行第一次加载图片,通过outWidth原图的宽度,通过outHeight获取原图的高,接下来通过控件的宽度和控件的高度来获取一个采样率sampleSize,接下来进行第二次采样设置inJustDecodeBounds为false,同时设置缩放比,设置inPreferredConfig的图片的图片格式有(分别为ALPHA_8,RGB_565,ARGB_4444,ARGB_8888),最后进行图片的加载.
 
具体实现代码:
 
BitmapFactory.Options options = new BitmapFactory.Options();
// 第一次:设为true时,仅仅得到边界,即宽高
options.inJustDecodeBounds=true;
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(),options);
 
// 第二次:将options的值设为Config.RGB_565,会比默认的Config.ARGB_8888减少一半内存;
options.inPreferredConfig= Bitmap.Config.RGB_565;
// 将边框缩减到原来宽高的1/100;
options.inSampleSize=Math.max(options.outWidth,options.outHeight)/100;
// 设置为false,表示不仅仅加载边框,
options.inJustDecodeBounds=false;

bitmap=BitmapFactory.decodeFile(file.getAbsolutePath(),options)

Android Listview 性能优化的更多相关文章

  1. Android ListView性能优化实例讲解

    前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListVi ...

  2. (翻译) Android ListView 性能优化指南

    本文翻译了Lucas Rocha的Performance Tips for Android’s ListView.这是一篇关于介绍如何提升ListView性能的文章,非常的优秀.使得我拜读之后,忍不住 ...

  3. Android之ListView性能优化——一行代码绑定数据——万能适配器

    如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...

  4. Android进阶笔记14:ListView篇之ListView性能优化

    1. 首先思考一个问题ListView如何才能提高效率 ? 当convertView为空时候,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象.当convertView不 ...

  5. ym——Android之ListView性能优化

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! Android之ListView性能优化 假设有看过我写过的15k面试题的朋友们一定知 ...

  6. Android进阶笔记11:ListView篇之ListView性能优化

    1. 首先思考一个问题ListView如何才能提高效率 ? 当convertView为空时候,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象.当convertView不 ...

  7. 【腾讯Bugly干货分享】跨平台 ListView 性能优化

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/FbiSLPxFdGqJ00WgpJ94yw 导语 精 ...

  8. 包建强的培训课程(9):Android App性能优化

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  9. Android开发性能优化总结(一)

    安卓开发应用首先要讲究良好的用户体验,如果一款软件卡顿现象严重,不流畅,经常崩溃,那么将给用户带来极不良好的体验,从而损失用户. 在实际开发和学习中,我总结了一下关于安卓性能的优化,供大家参考交流. ...

随机推荐

  1. Point ZM 转换为Point 类型

    打开ArcToolbox,使用ConvertionTools-> To Shapefile->FeatureClass to Shapefile 工具,注意在环境设置里,里将output ...

  2. IP和端口的相关检测

    1.查看自己电脑的ip,使用ipconfig命令 2.检测某个ip是否可以连通,直接使用ping命令 3.windows下查看本机都有哪些端口开放,使用netstat -anp tcp 命令 4.查看 ...

  3. USACO2011Brownie Slicing巧克力蛋糕切片

    Description     Bessie烘焙了一块巧克力蛋糕.这块蛋糕是由R*C(1 <= R,C <= 500)个小的巧克力蛋糕组成的. 第i行,第j列的蛋糕有N_ij(1 < ...

  4. gcc -fvisibility=hidden,-fPIC选项

    1. http://www.tuicool.com/articles/fy6Z3aQ 2. http://www.ibm.com/developerworks/cn/linux/l-cn-sdlsta ...

  5. 简单回忆一下JavaScript中的数据类型

    说到JavaScript,大家都应该知道,它是一门脚本语言,也是一门弱类型语言,也是一门解析型的语言,同时也是一门动态类型的语言. 很好,至于JavaScript中数据类型.其分为基本数据类型和复杂数 ...

  6. Android性能优化篇

    很多App都会遇到以下几个常见的性能问题: 启动速度慢:界面跳转慢:事件响应慢:滑动和动画卡顿. 一.启动速度优化. 优化初始化任务: 1. 把一些初始化任务懒加载初始化 2. 把初始化任务并行化(异 ...

  7. python——协程

    由于python中的多线程比较特殊,所以协程的概念就变得尤为珍贵了,对于cpu密集型的操作,使用协程的效率无疑要好过多线程很多.因为协程的创建及其间切换的时间成本要低于线程很多.也因为这一点,很多人说 ...

  8. win10窗口设置眼睛保护色

    经常电脑前坐着,习惯了豆沙色窗口(据说保护眼睛): 目标 记事本,ide,office等窗口颜色豆沙色:如下图 步骤 打开注册表:win+r 运行"regedit": 依次打开[H ...

  9. GDI+一般性错误(A generic error occurred in GDI+)

    1.GDI+的前世今生 GDI+全称图形设备接口,Graphics Device Interface (GDI) ,他的爸爸叫做GDI, 用C写的.Windows XP出来以后用C++重新写了一下,变 ...

  10. PHP的三种输出方式

    (1)echo 是PHP语句,没有返回值,用于输出一个或多个字符串 (2)print() 是函数,可以有返回值,只能打印出简单类型变量的值,例如int.string (3)print_r() 是函数, ...