顺利滚动的ListView
是保持应用程序的主线程(UI线程)无起繁重的处理。确保你做任何磁盘访问,网络访问,或在一个单独的线程SQL访问。为了测试你的应用程序的状态,您可以启用StrictMode
。
使用后台线程
使用后台线程(“工作线程”)删除主线程应变,因此可以专注于绘制用户界面。在许多情况下,使用AsyncTask
提供给主线程之外执行工作的简单方法。AsyncTask
自动排队所有的execute()
请求并执行它们串联。这种行为是全局的一个特定的过程,意味着你不必担心创建你自己的线程池。
在下面的示例代码,一个AsyncTask的
用于加载图像在后台线程中,然后将它们应用到一旦完成了用户界面。这也表明在地方的图像的进度微调,而他们正在装载。
// 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
这样你就可以使它能够在多个处理器内核上运行。而不是调用的execute()
可以指定executeOnExecutor()
和多个请求可以在同一时间执行取决于可用内核的数量。
View Holder
您的代码可能调用findViewById()
频繁的滚动过程中的ListView
,这会降低性能。即使当Adapter
返回回收 inflated view ,你仍然需要查找的元素和更新它们。一种方法周围反复使用findViewById()
是使用“ViewHolder”的设计模式。
一个ViewHolder
对象的每个布局的标记字段内的组件视图,因此您可以立即访问它们,而不需要反复看看他们的商店。首先,你需要创建一个类来保存您的具体意见集。例如:
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 );
现在,您可以轻松地访问每个视图,而无需查表,节省了宝贵的处理器周期。