listview是一个比较重要的UI组件,一切影响UI的操作,比如适配器从磁盘、网络或者数据库中加载数据的操作,最好都放在子线程中完成。子线程可以使用thread,不过那样比较老土,官方推荐使用AsyncTask。

AsyncTask会自动排队 execute() 任务,并且顺序执行。你的应用进程只需使用它就是了。

// Using an AsyncTask to load the slow images in a background thread
new AsyncTask<ViewHolder, Void, Bitmap>() {
// ViewHolder缓存着适配器中每一个convertView上的可视组件
private ViewHolder v; @Override
protected Bitmap doInBackground(ViewHolder... params) {
v = params[0];
// 以某种方式获取到了bitmap,返回该图片
return mFakeImageLoader.getImage();
} @Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
if (v.position == position) {
// If this item hasn't been recycled already, hide the
// progress and set and show the image
// 每一个converView上的等待提示消失
v.progress.setVisibility(View.GONE);
// ImageView可见
v.icon.setVisibility(View.VISIBLE);
v.icon.setImageBitmap(result);
}
}
}.execute(holder);

通过ViewHolder,可以避免由于findViewById()带来的性能瓶颈。

static class ViewHolder {
TextView text;
TextView timestamp;
ImageView icon;
ProgressBar progress;
int position;
}
ViewHolder holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image);
holder.text = (TextView) convertView.findViewById(R.id.listitem_text);
holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp);
holder.progress = (ProgressBar) convertView.findViewById(R.id.progress_spinner);
convertView.setTag(holder);

再举个例子,来自于http://blog.csdn.net/fmoonstar/article/details/7748857

当每个ListView的item的converView为空时,将每一个小组件缓存在ViewHolder上,当convertView重复利用时,则取之前已经缓存的小组件,提高ListView的滚动性能。

提升布局性能____Making ListView Scrolling Smooth的更多相关文章

  1. 提升布局性能____Re-using Layouts with <include/>

    可以再一个布局中通过"include"和"merge"元素进行复用其他的布局元素. 比如如下一个布局: <FrameLayout xmlns:androi ...

  2. 极光开发者沙龙 之 移动应用性能优化实践 【一】旧酒新瓶——换个角度提升 App 性能与质量

    旧酒新瓶--换个角度提升 App 性能与质量 主讲人:高亮亮 ---   饿了么移动技术部高级iOS工程师,负责饿了么商家版iOS APP开发,对架构和系统底层有深入研究,擅长移动性能分析,troub ...

  3. Android开发——布局性能优化的一些技巧(一)

    0. 前言 上一篇我们分析了为什么LinearLayout会比RelativeLayout性能更高,意义在于分析了这两种布局的实现源码,算是对一个小结论的证明过程,但是对布局性能的优化效果,对这两种布 ...

  4. [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能

    [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...

  5. 提升PHP性能的21种方法

    提升PHP性能的21种方法. 1.用单引号来包含字符串要比双引号来包含字符串更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会.2.如果能将类的方法定义成static,就尽量定义成st ...

  6. HHVM 是如何提升 PHP 性能的?

    背景 HHVM 是 Facebook 开发的高性能 PHP 虚拟机,宣称比官方的快9倍,我很好奇,于是抽空简单了解了一下,并整理出这篇文章,希望能回答清楚两方面的问题: HHVM 到底靠谱么?是否可以 ...

  7. 使用异步HTTP提升客户端性能(HttpAsyncClient)

    使用异步HTTP提升客户端性能(HttpAsyncClient) 大家都知道,应用层的网络模型有同步.异步之分. 同步,意为着线程阻塞,只有等本次请求全部都完成了,才能进行下一次请求. 异步,好处是不 ...

  8. React爬坑秘籍(一)——提升渲染性能

    React爬坑秘籍(一)--提升渲染性能 ##前言 来到腾讯实习后,有幸八月份开始了腾讯办公助手PC端的开发.因为办公助手主推的是移动端,所以导师也是大胆的让我们实习生来技术选型并开发,他来做code ...

  9. 十个技巧迅速提升JQuery性能

    本文提供即刻提升你的脚本性能的十个步骤.不用担心,这并不是什么高深的技巧.人人皆可运用!这些技巧包括: 使用最新版本 合并.最小化脚本 用for替代each 用ID替代class选择器 给选择器指定前 ...

随机推荐

  1. java设计模式(2)

    工厂模式定义 在面向对象程序设计中,工厂通常是用来创建其他对象的对象,工产模式根据不同的参数来实现不同的分配方案和创建对象. 在工产模式中,我们创建对象时不会对客户端暴露创建逻辑,而且是通过使用一个共 ...

  2. golang1.8 通过plugin方式build so

    golang1.83只有linux下支持plugin方式生成so package main // // No C code needed. import "C" import ( ...

  3. GIS基础软件及操作(八)

    原文 GIS基础软件及操作(八) 练习八.地理建模 地理建模:Model Builder 土壤侵蚀危险性建模分析 认识ModelBuilder操作界面 1: 添加硬盘上的数据或工具到模型中,数据也可以 ...

  4. C#最简单的文本加密

    #region AES加密 public static byte[] TextEncrypt(string content, string secretKey) { byte[] data = Enc ...

  5. windows界面程序设计,设置一个窗口始终在屏幕最前,SetWindowPos函数

    有时这种需求还是很必须的,比如现在做的一个登录验证系统,如果在windows登录界面点击到窗口外面,那窗口就会永远隐藏掉没法再启用了.这种情况必须设置该窗口一直在最前. 使用函数SetWindowPo ...

  6. WinForm子线程调用主线程

    public Form1() { InitializeComponent(); Thread t = new Thread(ThreadWorker); t.Start(); } private vo ...

  7. BooleanToColorConverter

    public class BooleanToColorConverter : IValueConverter { public object Convert(object value, Type ta ...

  8. 至于Nim和Crystal这类语言最大的用途,就是活在脑残粉的理想里(发人警醒)

    lisp,haskell 有很多人在用,而且是编程经验在 10 年以上,包括 Rust 的作者.Nim 的作者.因此,你不知道有人用,那是因为你的开发阅历太低. 人工智能这个领域从来没有脱离 lisp ...

  9. Qt的QWaitCondition(允许线程在一定条件下唤醒其他线程,这样对不间断上传可能比较适用)

    对生产者和消费者问题的另一个解决办法是使用QWaitCondition,它允许线程在一定条件下唤醒其他线程.其中wakeOne()函数在条件满足时随机唤醒一个等待线程,而wakeAll()函数则在条件 ...

  10. [java代码库]-简易计算器(第一种)

    简易计算器(效果如图所示) 第一种方案:采用Javascript+html完成计算器,支持+-*/,结果显示不允许使用input输入域(可以考虑使用<span>) <html> ...