提高显示布局文件的性能 4 - 提升ListView的性能

Making ListView Scrolling Smooth [使得ListView滚动平滑]

使得滚动ListView平滑的关键在与保持AP的UI thread与复杂的操作隔离。

确保另起一个Thread来处理Disk IO,network access或者SQL access.
为了测试AP的状态,可以enable StrictMode.(Android
ICS 4.0上已经默认开启了StrickMode)

Use a Background Thread [使用后台线程]

使用后台线程,这样可以使得UI线程可以专注于描绘UI。
大多数时候,AsycnTask实现了一种简单把需要做的事情与main thread隔离的方法。
[关于如何使用AsyncTask,请参考官方详解,或者参看本人前面一篇文章:使用AsyncTask来处理一些简单的需要后台处理的动作]

下面是一个例子:

  1. // Using an AsyncTask to load the slow images in a background thread  
  2. new AsyncTask<ViewHolder, Void, Bitmap>() {  
  3.     private ViewHolder v;  
  4.   
  5.     @Override  
  6.     protected Bitmap doInBackground(ViewHolder... params) {  
  7.         v = params[0];  
  8.         return mFakeImageLoader.getImage();  
  9.     }  
  10.   
  11.     @Override  
  12.     protected void onPostExecute(Bitmap result) {  
  13.         super.onPostExecute(result);  
  14.         if (v.position == position) {  
  15.             // If this item hasn't been recycled already, hide the  
  16.             // progress and set and show the image  
  17.             v.progress.setVisibility(View.GONE);  
  18.             v.icon.setVisibility(View.VISIBLE);  
  19.             v.icon.setImageBitmap(result);  
  20.         }  
  21.     }  
  22. }.execute(holder);  

从Android 3.0开始,对于AsyncTask有个额外的特色:在多核处理器的情况下,我们可以使用executeOnExecutor() 来替代execute(),这样系统会根据当前设备的内核数量同时进行多个任务。

Hold View Objects in a View Holder [如何使用View Holder来Hold住view对象]

你的程序在滚动ListView的时候也许会重复频繁的call findViewById(),这样会降低性能。

尽管Adapter会因为循环机制返回一个创建好的View(关于这个机制,请参考鄙人前面的文章:ListView中getView的原理与解决多轮重复调用的方法)

你仍然需要查找到这些组件并更新它,避免这样的重复,我们可以使用ViewHolder的设计模式。

A ViewHolder对象存放每一个View组件于Layout的tag属性中,因此我们可以立即访问tag中的组件从而避免重复call findViewById()。

下面是定义了一个ViewHolder的例子:

  1. static class ViewHolder {  
  2.   TextView text;  
  3.   TextView timestamp;  
  4.   ImageView icon;  
  5.   ProgressBar progress;  
  6.   int position;  
  7. }  

这样之后,我们可以填充这个ViewHolder,并且保存到tag field.

  1. ViewHolder holder = new ViewHolder();  
  2. holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image);  
  3. holder.text = (TextView) convertView.findViewById(R.id.listitem_text);  
  4. holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp);  
  5. holder.progress = (ProgressBar) convertView.findViewById(R.id.progress_spinner);  
  6. convertView.setTag(holder);  

那么我们就可以直接访问里面的数据了,省去了重复查询,提升了性能。

时间: 2024-11-01 06:30:05

提高显示布局文件的性能 4 - 提升ListView的性能的相关文章

提高显示布局文件的性能 3 - 按需载入视图(ViewStub的使用方法)

Loading Views On Demand [按需载入视图] 某些时候,我们需要一些很复杂的视图却仅仅很少用到.如果我们在它仅仅需要的时候再载入,这样可以减少内存的使用并且给用户带来流畅的体验. Define a ViewStub [定义ViewStub] ViewStub是一个轻量级的view,没有占有空间,没有花费draw的资源,也没有参与在任何一个layout里面. 不仅创建它仅需要很少的系统资源,而且存留在View的层级也是个比较不花费资源的动作. 每一个ViewStub简单的包含一

提高显示布局文件的性能 2 - 使用include标签重用Layout

Re-using Layouts with <include/> 尽管Android提供了很多种小的组件可以重用,我们还需要自定义一些稍微复杂一点的小组件进行重用.我们可以使用<include/> and <merge/> 标签来对当前的layout嵌入一些其他的layout. 在创建一个稍微复杂一点的layout时,重用layout是个很给力的方法.比如我们需要一个YES/NO的控制栏,包含文字提示的Progress bar.这意味着我们可以在很多地方重用那些自定义的

Android Studio 实时显示布局文件Preview窗口

Android Studio的功能包含preview窗口, 可以查看布局(layout)的样式;     位置:app->src->main->res(资源)->layout(布局), 其中的文件, 包含design和text,选择text, 就可以观察到preview窗口;     也可以通过Tool Windows进行设置;     具体位置:view->Tool Windows->Preview

PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)

伴随着PHP 7的发布,这几天关于PHP 7性能和兼容性成了大家讨论的热点话题,PHP 7表现出来的高性能让不少人蠢蠢欲动,有些"尝鲜"的朋友已经将PHP 7应用到了生产环境当中了.同时,LNMP等热门应用程序也及时作了更新,纷纷开始支持PHP 7. 提到PHP性能问题,不得不说之前分享的HHVM,这是脸谱公司为提高PHP性能而开发出来的工具,使用了 Just-In-Time (JIT) 编译方式将 PHP 代码转换成某种字节码.实际测试过程中,HHVM对于PHP的性能提高是一个质的飞

分享五个PHP7性能优化提升技巧_php实例

PHP7已经发布了, 作为PHP10年来最大的版本升级, 最大的性能升级, PHP7在多放的测试中都表现出很明显的性能提升, 然而, 为了让它能发挥出最大的性能, 我还是有几件事想提醒下. 1. Opcache 记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, 所以之前测试时期就发生了有人一直没有启用Opcache的事情. 启用Opcache非常简单, 在php.ini配置文件中加入: zend_extension=opcac

串接样式表(CSS)来显示XML文件

css|xml|显示|样式表     在本章中,你将学习显示XML 文件于Microsoft Internet Explorer 5 中的第一种方法:串接样式表(CSS).串接样式表是一个包含安排XML 文件中元素相关指令的档案.因为你已经利用XML创造了自己的元素,浏览器并不知道如何适当地显示这些元素.建立串接样式表并将它链接到XML 文件中便是一种告诉浏览器如何显示文件中每个元素的方法.附加串接样式表的XML 文件可以直接在Internet Explorer 5 中被开启.你不需要使用HTM

android-安卓开发 如何在代码中动态切换fragment加载的布局文件?

问题描述 安卓开发 如何在代码中动态切换fragment加载的布局文件? viewpager和fragment一起用的时候,比如有啊,吧,a,b,c,三页,一开始显示的是a,我想当用户滑到b和c时先显示的是一个loding的圆环进度条,之后再显示这个fragment的内容,请问应该如何做? 解决方案 上面说的是fragment之间的切换,你这个问题直接用view.setVisibility()方法控制进度条隐藏或显示就好了,也可以吧进度条放在Dialog或pupopWindow等当中控制show

二维数组-C#中如何大幅提高写excel文件的速度?

问题描述 C#中如何大幅提高写excel文件的速度? 输入文件:input.txt包含以[:]号或者[t]制表符分隔的多行(实际在100万行以上)数据,每行数据个数不定. a;b;c 1;2; 1;2;3;4;5 输出文件;output.xlsx a b c 1 2 1 2 3 4 5 问题:写了个小程序处理2000行在10s以内,百万行速度就太慢,无法忍受了.求教一些能显著提高写Excel速度的方法.网上查的先变成二维数组之类的方法,效果不大.百万行在20min以内就好. 解决方案 你完全没有

android-如何快速的编写Android布局文件?

问题描述 如何快速的编写Android布局文件? 感觉手写布局文件效率太低了,或者说有在哪位大神能推荐一个Android模板布局网站,如果在开发的时候能有一些模板布局文件那么效率也会大大的提高. 解决方案 android 编写布局文件Alt+/不能自动补全Android 的布局文件中的注释Android布局文件xml 解决方案二: 想法不错 不过貌似没有这种网站吧 解决方案三: 可以在xml文件中拖拽控件.. 解决方案四: 只能手写,没办法,快捷一点就是用自带的自动补全.androidstudi