[翻译]android中如何使得ListView滑动流畅
2015-09-06 17:05
441 查看
本文翻译的是官网的这篇文章。
下面是一个简单的例子,AsyncTask用来在后台线程中下载图片,并在下载完成后应用到UI中。当下载的时候也在展示图片的地方显示了一个进度条。
从Android 3.0(API 11)开始,AsyncTask有了一个额外的特性,这个特性使得AsyncTask能够在多处理器内核中运行。用executeOnExecutor()方法替代execute()方法可以在多个内核中同时执行多个请求。
ViewHolder对象在布局的Tag域中保存每一个组件,因此你可以迅速的访问他们而不需要重复的找到它们。首先创建一个类来保存确切的View集合。例如:
然后填充ViewHolder并且在布局中保存它。
现在你可以轻松的读取每一个view,而不需要一个一个查找了,节省有限的处理器周期。
前言
保证LitView滑动流畅的关键在于:保持应用程序的主线程(既UI线程)不运行复杂的进程。确定任何要硬盘读取、网络读取或者数据库读取的行为在一个独立的线程中进行。你可以激活StrictMode模式来测试你的APP的状态。1.使用后台线程
使用一个后台线程(工作线程)可以减轻主线程的压力,这样主线程就可以专注UI的绘制。在很多的解决办法中,AsyncTask提供了一种简单的方式实现在主线程之外完成耗时任务。AsyncTask 自动排列并且顺序执行所有的execute()请求。这些行为是在一个全局唯一的进程里面进行的,所以你不用去创建自己的线程池。下面是一个简单的例子,AsyncTask用来在后台线程中下载图片,并在下载完成后应用到UI中。当下载的时候也在展示图片的地方显示了一个进度条。
// 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);
从Android 3.0(API 11)开始,AsyncTask有了一个额外的特性,这个特性使得AsyncTask能够在多处理器内核中运行。用executeOnExecutor()方法替代execute()方法可以在多个内核中同时执行多个请求。
2.用View Holder保存View对象
在滑动ListView的过程中,你的代码可能频繁的调用findViewById(),这降低性能。甚至是在Adapter返回已经填充好了的View的时候,仍然需要找到各个组件并且更新他们。一种循环使用findViewByIdea()的方法是使用“view holder”设计模式。ViewHolder对象在布局的Tag域中保存每一个组件,因此你可以迅速的访问他们而不需要重复的找到它们。首先创建一个类来保存确切的View集合。例如:
static class ViewHolder { TextView text; TextView timestamp; ImageView icon; ProgressBar progress; int position; }
然后填充ViewHolder并且在布局中保存它。
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);
现在你可以轻松的读取每一个view,而不需要一个一个查找了,节省有限的处理器周期。
相关文章推荐
- Android国际化问题
- Android ViewPager 和 TabPageIndicator 的限制滑动和禁用点击
- Android 百分比布局库(percent-support-lib) 解析与扩展
- 【Paint】Android 自定义View之Paint篇(更新中...)
- Android Region代码分析
- Android第一步
- Android studio工程有重复包时报错
- Android 自己实现 NavigationView
- Android 禁止应用在模拟器上运行的实现
- android下Json操作
- Android调用拨打电话 代码
- android desgin TabLayout 、Snackbar 、自定义TabLayout学习
- 从AIDL开始谈Android进程间Binder通信机制
- 如何在mac本上安装android sdk
- Android 设置 横屏 竖屏
- 使用HTML来生产Android界面
- android基本控件学习网址
- 冷门但是却能很好提升性能的android技能
- 获取Android手机CPU类型 ARM、ARMV7、NEON
- Android中ViewPager添加标题