分享

Making ListView Scrolling Smooth

 android之情殇 2012-12-27

Making ListView Scrolling Smooth

(版本间的差异)
(未显示1个用户的1个中间版本)
第3行: 第3行:
 
作者:zachgenius
 
作者:zachgenius
 
 
完成时间:
+
完成时间:2012.8.29
 
=Making ListView Scrolling Smooth=
 
=Making ListView Scrolling Smooth=
 
 
 
让ListView平滑滚动的关键在于将程序的主线程(UI线程)从大量的处理中解脱出来。要要保证用单独的线程来进行磁盘,网络或SQL操作。想要测试你的程序的状态, 你可以开启StrictMode。
 
让ListView平滑滚动的关键在于将程序的主线程(UI线程)从大量的处理中解脱出来。要要保证用单独的线程来进行磁盘,网络或SQL操作。想要测试你的程序的状态, 你可以开启StrictMode。
 
 
==[[Use a Background Thread | 使用后台线程 - Use a Background Thread]]==
+
==使用后台线程==
 
 
 +
使 用后台线程(“工作线程”)可移除主线程中德压力,以至于集中精力绘制UI。在很多案例中,利用AsyncTask(异步任务)可以提供一种在主线程之外 执行你的工作简单的方法。AsyncTask 自动将所有execute()请求排成队列并按顺序执行他们。这种行为对一个特定进程来说是全局性的,这意味着你不必担心创建自己的线程池。
 
 
==[[Hold View Objects in a View Holder | 在View Holder中保存视图对象 - Hold View Objects in a View Holder]]==
+
下方所示的简单代码中,利用AsyncTask在后台线程中加载图像,然后一旦完成便应用在UI中。也可以显示一个进度条来代替正在加载的图像。
 +
 
 +
<java>
 +
// 利用AsyncTask在后台线程中加载缓慢的图像
 +
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) {
 +
            // 如果该项目还未被回收, 隐藏进度条,设置并显示图像
 +
            v.progress.setVisibility(View.GONE);
 +
            v.icon.setVisibility(View.VISIBLE);
 +
            v.icon.setImageBitmap(result);
 +
        }
 +
    }}.execute(holder);
 +
</java>
 +
 
 +
从Android3.0(API Level 11)起,在AsyncTask中可以使用一项新的功能,你可以通过开启它来
 +
在多处理器内核间交叉运行线程。除了调用execute()方法,你可以使用executeOnExecutor()方法而同时执行多个请求,而这取决于可用的核心数量。
 +
 
 +
==在View Holder中保存视图对象==
 
 
 
你的代码可能在滑 动ListView时频繁地调用findViewById(),而这可使效果变慢。即使在Adapter为了回收而返回一个已经展现出来的视图,你仍然需 要查找这些元素并且更新他们。一个循环使用findViewById()的方法是使用“view holder”设计模式。
 
你 的代码可能在滑动ListView时频繁地调用findViewById(),而这可使效果变慢。即使在Adapter为了回收而返回一个已经展现出来的 视图,你仍然需要查找这些元素并且更新他们。一个循环使用findViewById()的方法是使用“view holder”设计模式。

2012年8月29日 (三) 22:17的版本

分任务链接地址:http://developer./training/improving-layouts/smooth-scrolling.html

作者:zachgenius

完成时间:2012.8.29

Making ListView Scrolling Smooth

让ListView平滑滚动的关键在于将程序的主线程(UI线程)从大量的处理中解脱出来。要要保证用单独的线程来进行磁盘,网络或SQL操作。想要测试你的程序的状态, 你可以开启StrictMode。

使用后台线程

使用后台线程(“工作线程”)可移除主线程中德压力,以至于集中精力绘制UI。在很多案例中,利用AsyncTask(异步任务)可以提供一种在主 线程之外执行你的工作简单的方法。AsyncTask 自动将所有execute()请求排成队列并按顺序执行他们。这种行为对一个特定进程来说是全局性的,这意味着你不必担心创建自己的线程池。

下方所示的简单代码中,利用AsyncTask在后台线程中加载图像,然后一旦完成便应用在UI中。也可以显示一个进度条来代替正在加载的图像。

 
// 利用AsyncTask在后台线程中加载缓慢的图像
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) {
            // 如果该项目还未被回收, 隐藏进度条,设置并显示图像
            v.progress.setVisibility(View.GONE);
            v.icon.setVisibility(View.VISIBLE);
            v.icon.setImageBitmap(result);
        }
    }}.execute(holder);
 

从Android3.0(API Level 11)起,在AsyncTask中可以使用一项新的功能,你可以通过开启它来 在多处理器内核间交叉运行线程。除了调用execute()方法,你可以使用executeOnExecutor()方法而同时执行多个请求,而这取决于可用的核心数量。

在View Holder中保存视图对象

你的代码可能在滑动ListView时频繁地调用findViewById(),而这可使效果变慢。即使在Adapter为了回收而返回一个已经展 现出来的视图,你仍然需要查找这些元素并且更新他们。一个循环使用findViewById()的方法是使用“view holder”设计模式。

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

现在你可以轻松的访问每一个视图而不需要频繁的去查询他们,这节省了宝贵的处理器周期。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多