zoukankan      html  css  js  c++  java
  • Android Developers:使ListView滑动流畅

    流畅滑动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; 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);   
    现在你能快速访问每个视图,不需要查找,节省宝贵的处理器时间。
  • 相关阅读:
    链表操作
    建立简单的链表
    scanf()函数用法小结
    快速求某年某月是第几天(未整理)
    合并两个有序数组(未整理)
    如何配置JAVA的环境变量、Tomcat环境变量
    【动态规划】流水作业调度问题与Johnson法则
    分治法(二)
    分治法(一)
    HTML5入门十一---Canvas画布实现画图(二)
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/4158130.html
Copyright © 2011-2022 走看看