ListView优化方案的几点解析
2014-12-27 23:51
267 查看
1、为什么做优化
说起为什么要对ListView这个控件做优化,这个问题还真不是那么容易回答,因为它要优化的原因实在是太简单,那就是Android手机性能有限,要让它跑起来很流畅,自然就有了优化的需求了。优化过后的应用程序,会跑得比较流畅,能够让用户体验显著提升。这里我们主要讨论它需要节约时间,让程序更加流畅。那么问题来了,如何节约时间了,这就是一个空间换时间的问题了。
2、ListView工作原理
如果要谈优化,首先应该对ListView这个控件怎么运行的了解清楚吧,这个东西不了解,我们谈优化犹如水中捞月一样,是个笑话。ListView其实是一个滑动控件,只是使用的是list集合存储数据,显示的方式是一个条目占满一行这样的形式来的。与之类似的GrivdView也是类似的工作原理,一通则百通,类似的道理。ListView是一堆具有相同属性的数据,展示在界面上。什么是有规律的呢?比如,食堂的一排桌子椅子,他们就是又规律的放在一起的,只是每个桌子上坐着的人可能不一样。如果我们把人看作数据,那么桌子和椅子就可以看作是我们界面上的控件。
基于上面的认识,我们会不会想到,如果是这样的话,我们只要获取到不同的数据,然后将控件复制多个就可以了,对不对?嗯,就是这样的,我们看一下下面的图示:
上面这幅图,是我从网上找来的,比我画得好,我就不重复造轮子了。这里有两个意思,第一个是重复创建很多个item控件,第二个是,利用相同的item控件。第一个我们上面已经解说了,这里不再赘述,我们谈谈第二个。这里我们发现一个问题,那就是我们的手机屏幕大小是有限的,但是item的数据内容可能就会有很多,不只是几条数据,几十条数据,可能成百上千条数据。那么,android系统中如何做优化的呢?
原始的方式,我们只显示这么多控件信息,控件保持不变,变化的是数据,使用相同的控件信息,但是使用不同的数据内容。哇靠,清晰了吧!
3、简单优化方式
最简单的方式是使用conentView进行缓存处理,这里代码如下:if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate( R.layout.item_more_view, null); holder.tv_item_title = (TextView) convertView .findViewById(R.id.tv_item_more_title); holder.iv_item_home = (ImageView) convertView .findViewById(R.id.iv_item_more_view); holder.tv_item_issue = (TextView) convertView .findViewById(R.id.tv_item_more_issue); holder.progressBar = (ProgressBar) convertView .findViewById(R.id.bar_item_more); holder.tv_item_person = (TextView) convertView .findViewById(R.id.tv_person_item_more); holder.btn_item_home = (Button) convertView .findViewById(R.id.btn_item_more); }
4、深度优化方式
经过简单的测试,上面的代码,大概能优化50%左右,但是我们发现,这种优化方式还不够,视图的回收并不是我们所期望的最好方式,这里我们可以把它再次缓存起来。说到底,还是一个空间换时间的思路:ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(mContext).inflate( R.layout.item_more_view, null); holder.tv_item_title = (TextView) convertView .findViewById(R.id.tv_item_more_title); holder.iv_item_home = (ImageView) convertView .findViewById(R.id.iv_item_more_view); holder.tv_item_issue = (TextView) convertView .findViewById(R.id.tv_item_more_issue); holder.progressBar = (ProgressBar) convertView .findViewById(R.id.bar_item_more); holder.tv_item_person = (TextView) convertView .findViewById(R.id.tv_person_item_more); holder.btn_item_home = (Button) convertView .findViewById(R.id.btn_item_more); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); }
这里的ViewHolder如下所示:
/** 界面控件 */ public final class ViewHolder { public TextView tv_item_title; // 标题栏 public ImageView iv_item_home; // 商品图片 public TextView tv_item_issue;// 显示第几期 public ProgressBar progressBar;// 进度条 public TextView tv_item_person;// 显示还有多少人 public Button btn_item_home;// 抢单按钮 }
5、优化总结
(1)、减少findViewById()的次数,findViewById是一个相对比较耗性能的操作,它每次都需要到布局文件中去查找空间信息,然后加载bean对象中的数据内容,显示在界面上。(2)、优化,其实也就是两种,一种是时间换空间,一种空间换时间。依照现在对用户体验的重视,硬件资源的价格下降,大多数情况都是使用空间换时间,要让用户体验更好。
(3)、缓存,优化要尤其注意缓存这个东西,它的优化是最快的。重新在内存中生成的时间远大于直接从内存中获取,最常见的就是数据库的链接,不要经常断开去查询,这样做是非常耗时的操作。
(4)、经验,在做优化的时候,经验也是很重要的,不过这一点在移动端并不是那么明显。在做服务器端开发的时候,这种经验就非常重要,你对一个业务的熟悉,有助于你写出更好的程序。优化并不仅仅是从程序代码中优化,也可以从业务流程上去优化。
相关文章推荐
- ListView加载速度/性能优化方案分析
- 对网络上关于listview异步加载优化方案的文章的总结
- Android之史上最强ListView优化方案
- ListView设置条目显示四种方案(listView的优化)
- ListView优化方案
- FreeBsd网络性能优化方案WEB sysctl.conf ,以及老大逐句解析
- Android中对ListView的展示的性能优化常见的两种方案
- 自定义adapter的基础上Listview优化方案以及几个小错误(checkbox吃掉点击事件以及对象重复问题)
- ListView加载速度/性能优化方案分
- ListView优化方案
- listView优化方案
- 优化JavaScripe 提升首页加载速度的几种方案解析
- ListView加载速度/性能优化方案分析
- ListView优化方案
- 异步加载(AsyncTask异步任务、Handler、Json解析、Lrucache缓存、ListView滑动优化等来实现ListView图文混排)
- 从三大方面全面解析ListView优化
- 关于ListView的优化方案
- ListView加载速度/性能优化方案分析
- listView主要三种优化方案
- ListView优化方案