展会信息港展会大全

Android Developers:使ListView滑动流畅
来源:互联网   发布日期:2015-11-26 13:28:36   浏览:1836次  

导读:流畅滑动ListView的关键是保持应用程序的主线程(UI线程)从免于繁重处理。确保你的任何硬盘访问,网络访问或者SQL访问在一个单独的线程中。为了测试你的应用个程序的状态,你能启动Stric...

流畅滑动ListView的关键是保持应用程序的主线程(UI线程)从免于繁重处理。确保你的任何硬盘访问,网络访问或者SQL访问在一个单独的线程中。为了测试你的应用个程序的状态,你能启动StrictMode。

使用后台线程

——————————————————————————————————————————————————————————————

使用一个后台线程(“工作线程”),从主线程中移除,所以它能专注于绘制UI。在许多情况下,使用AsyTask提供的简单方式,在主线程之外来执行你的工作。AsyncTask自动队列保存所有execute()请求,并连续的执行它们。这个行为对于一个进程是全局的,并且意味着你不需要担心创建你自己的线程池。

在下面的这个示例代码中,AsyncTask是被用于在后台线程中下载图片,然后一旦完成将它们显示到UI中。当它们在下载的时候,它也在图片的位置显示了一个进度条。

[java]

// Using an AsyncTask to load the slow images in a background thread

new AsyncTask<ViewHolder, Void, Bitmap>() {

private ViewHolder v;

@Override

protected Bitmap doInBackground(ViewHolder... params) {

v = params[0];

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

v.progress.setVisibility(View.GONE);

v.icon.setVisibility(View.VISIBLE);

v.icon.setImageBitmap(result);

}

}

}.execute(holder);<span style="font-family:Arial,sans-serif; font-size:10pt; background-color:transparent; color:windowtext"> </span>

从Android3.0开始(API level11),在AsyncTask中有一个额外的功能,这么你能启用它来运行在多处理器核心中。替代调用execute()方法,你能调用executeOnExecutor()方法,然后基于可用的核数,多个请求能在同一时间上运行。

在View Holder中保存视图

——————————————————————————————————————————————————————————————

当滑动ListView的时候,你的代码应该会经常调用findViewById()方法,它会减缓性能。即使Adapter返回一个在填充视图循环使用,你一直需要寻找这个元素并更新他们。一种不错的使用findViewById()方法的方式,是使用“view holder”设计模型。

ViewHolder对象存放了布局标记区域的视图组件,所以你能立刻访问它们,不需要重复的寻找它们。首先,你需要创建一个类来保存你需要的视图组。例如:

[java]

static class ViewHolder {

TextView text;

TextView timestamp;

ImageView icon;

ProgressBar progress;

int position;

}

然后填充这个ViewHolder,并在这个布局中保存它。

[java]

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);

现在你能快速访问每个视图,不需要查找,节省宝贵的处理器时间。

赞助本站

人工智能实验室

相关热词: android开发 教程

AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港