当前位置: 首页 > 知识库问答 >
问题:

改进ListView性能的建议

丁淇
2023-03-14

我正在使用自定义列表视图来显示图像和文本。下面是我的列表视图项的布局文件和后面的代码。我会在帖子的底部解释我的问题。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="5dp"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/imgTitleImage"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:scaleType="fitXY" />

    <TextView
        android:id="@+id/tvNewsTitle"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/imgTitleImage"
        android:layout_alignStart="@+id/imgTitleImage"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:paddingLeft="10dp"
        android:paddingStart="10dp"
        android:paddingRight="10dp"
        android:paddingEnd="10dp"
        android:paddingTop="2dp"
        android:paddingBottom="2dp"
        android:gravity="top|start"
        android:textColor="#FFFFFF"         
        android:background="#80000000" />
</RelativeLayout>

下面是将必要信息加载到列表视图中的后端代码。

public View getView(final int position, View convertView, ViewGroup parent) 
    {
        SessionManagement sessionmanagement = new SessionManagement(context);
        ViewHolder holder = null;

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.news_item, null);
            holder = new ViewHolder();
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }

        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Touch on view handle                              
                ObjNews objNews = objNewss[position];

                Intent intent = new Intent(activity, NewsViewActivity.class);       

                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                intent.putExtra("newsId", String.valueOf(objNews.newsId));
                intent.putExtra("type", String.valueOf(Config.NEWS_BRANCH));

                context.startActivity(intent);
            }

        });

        holder.imageView = (ImageView)convertView.findViewById(R.id.imgTitleImage);

        //calculate the screen size and image ratio
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);

        int width = size.x;
        float screenRatio = width / 320f;

        holder.imageView.getLayoutParams().height = (int)(75f * screenRatio);
        holder.imageView.getLayoutParams().width = (int)(320f * screenRatio);

        Bitmap titleImage = Global.GetBitmapFromURL("http://www.domain.com/" + objNewss[position].titleImage);

        if(titleImage != null)
        {
            holder.imageView.setImageBitmap(titleImage);
        }   
        else
        {
            holder.imageView.setImageDrawable(context.getResources().getDrawable(R.drawable.news_title_default));    
        }

        //customizing view
        holder.textView = (TextView)convertView.findViewById(R.id.tvNewsTitle);
        holder.textView.setText(objNewss[position].title);                     

        return convertView;
    }

12-21 03:54:20.827:D/OpenGrenderer(1248):启用调试模式0

12-21 03:54:20.955:我/编舞(1248):跳过36帧!应用程序可能在其主线程上做了太多的工作。

12-21 03:54:24.991:D/DalvikVM(1248):GC_FOR_ALLOC释放467K,14%释放4447K/5116K,暂停8ms,共17ms

12-21 03:54:35.607:D/DalvikVM(1248):GC_FOR_ALLOC自由<1K,16%自由4560K/5368K,暂停14ms,共15ms

12-21 03:54:43.363:D/DalvikVM(1248):GC_FOR_ALLOC释放322K,18%释放4415K/5368K,暂停8ms,共8ms

12-21 03:54:44.611:D/DalvikVM(1248):GC_FOR_ALLOC释放281K,18%释放4415K/5368K,暂停8ms,共9ms

12-21 03:54:46.531:W/EGL_GenyMotion(1248):未实现eglSurfaceAttrib

12-21 03:54:48.115:D/DalvikVM(1248):GC_FOR_ALLOC释放284K,18%释放4420K/5368K,暂停8ms,共10ms

12-21 03:54:49.983:D/DalvikVM(1248):GC_FOR_ALLOC释放323K,18%释放4429K/5368K,暂停6ms,共6ms

12-21 03:54:50.339:D/DalvikVM(1248):GC_FOR_ALLOC释放280K,18%释放4439K/5368K,暂停11ms,共11ms

12-21 03:54:50.551:我/编舞(1248):跳过1523帧!应用程序可能在其主线程上做了太多的工作。

12-21 03:54:51.263:D/DalvikVM(1248):GC_FOR_ALLOC释放288K,17%释放4500K/5368K,暂停8ms,共9ms

12-21 03:54:54.115:D/DalvikVM(1248):GC_FOR_ALLOC释放326K,17%释放4497K/5368K,暂停7ms,共9ms

12-21 03:54:54.531:D/DalvikVM(1248):GC_FOR_ALLOC释放281K,17%释放4496K/5368K,暂停10ms,共10ms

12-21 03:54:55.871:D/DalvikVM(1248):GC_FOR_ALLOC释放287K,17%释放4506K/5368K,暂停8ms,共9ms

12-21 03:54:56.591:D/DalvikVM(1248):GC_FOR_ALLOC释放324K,17%释放4506K/5368K,暂停7ms,共8ms

12-21 03:54:57.339:D/DalvikVM(1248):GC_FOR_ALLOC释放281K,17%释放4506K/5368K,暂停7ms,共8ms

可能是由于“位图titleImage=global.getbitmapfromurl(”http://www.domain.com/“+objnewss[position].titleImage);”这行代码。如果注释,加载明显更快。

请问有没有专家给我更好的建议?更好的是,如果可以实现异步加载,如groupon等,它加载和显示行,不会干扰用户体验。

非常感谢。

共有1个答案

符鸿光
2023-03-14

Global.GetBitMapFromurl似乎在主线程上运行。任何网络请求都应该在单独的线程上完成,所以您应该将其移到AsyncTask或Loader中,这样可以解决问题。

 类似资料:
  • 我正在编写一种方法来查找高达n的素数(埃拉托色尼筛),是的,这是为了家庭作业。我希望在我编写的方法中提高性能。在过去的几天里,我一直在调整这个,但无法遵循给定的伪代码并提高性能。 伪代码如下: 创建一个数字队列来处理 用包含2到n的整数填充队列 创建一个空的结果队列来存储素数 重复以下步骤: 通过从数字队列中删除第一个值来获取下一个素数p 将p放入素数的结果队列 循环通过数字队列消除所有可被p整除

  • 所以我在FXML中定义了一个ListView 以及相应的方法 方法不是很大,但是第一行代码只在5秒后执行!但是在同一程序中的另一个ListView中,ListView没有速度问题?怎么会呢?如果需要任何其他信息,请评论

  • 我们正在尝试使用Apache Phoenix驱动程序来提高HBase设置的读取性能,以对抗约1150万条记录的数据集。 HBase 0.98 Apache Phoenix driver 4.3.1 Squirrel Client 3.2 该表由21列组成,下面是DDL语句: 我们已经对表执行了salting(salt buckets=3),并在所有列上创建了一个辅助索引(不可变索引)。 我们执行以

  • 我们看到ORC和带分区的ORC执行相同(有时我们看到B/W ORC分区和不带分区的ORC差别很小)。带分区的ORC会比ORC表现更好吗。带分区桶的ORC会比ORC分区表现更好吗?。我看到每个ORC分区文件都接近50-100 MB,ORC带外分区(每个文件大小为30-50 MB)。 **注:120 GB的Un压缩数据被压缩为17 GB的ORC文件格式

  • 我们在当前项目中使用GWT 2.4版。在服务器端,我们使用Spring 我们使用Maven作为构建工具。该应用程序正在JBOSS 7服务器上部署。 目前,我们在一个Eclipse项目中拥有所有内容。指一个应用程序。gwt。xml文件和一个ApplicationContext。spring的xml。我们有大约2000个Java文件,其中大约1500个用于GWT相关的源文件。 该项目仍在增长,源文件越

  • 一、目标 在图像处理中,由于您每秒处理大量操作,因此您的代码必须不仅提供正确的解决方案,而且还要以最快的方式提供。所以在本章中,您将学习 衡量代码的性能。 一些提高代码性能的技巧。 您将看到以下函数:cv2.getTickCount,cv2.getTickFrequency等。 除了OpenCV之外,Python还提供了一个time模块,有助于测量执行时间。另一个profile模块有助于获得有关代