Android最佳实践性能(三)提高性能布局(使ListView滚动流畅)


这节课教你

  1. 使用后台线程
  2. 保持视图对象的视图架

你也应该阅读

  • 为什么我的列表黑?一个Android优化

顺利滚动的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 );

现在,您可以轻松地访问每个视图,而无需查表,节省了宝贵的处理器周期。

你可能感兴趣的:(Android最佳实践性能(三)提高性能布局(使ListView滚动流畅))