2014-12-21 2 views
0

Я использую пользовательский просмотр списка, чтобы показать изображение и текст. Ниже представлен файл макета для моего элемента списка просмотра и кода. Я объясню свою проблему в нижней части сообщения.Предложение по улучшению производительности ListView

<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/OpenGLRenderer (1248): Включение режима отладки 0

12-21 03: 54: 20,955: I/Хореограф (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.587: Д/dalvikvm (1248): GC_FOR_ALLOC освободил 263K, 16% бесплатно 4416K/5220K, остановился 7MS, общий 9ms

12-21 03: 54: 35.591: I/dalvikvm-кучи (1248): Grow кучу (осколочной случай), чтобы 4.647MB для выделения 148492 байт

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: ​​Вт/EGL_genymotion (1248): eglSurfaceAttrib не

12-21 03: 54: 48.115: D/dalvikvm (1248): GC_FOR_ALLOC освобожден 2 84K, 18% бесплатно 4420K/5368K, остановился 8ms, общая 10ms

12-21 03: 54: 49,983 D/dalvikvm (1248): GC_FOR_ALLOC освободил 323K, 18% бесплатно 4429K/5368K, приостановлена ​​6 мс, общая 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: I/Хореограф (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

Это может быть из-за «Bitmap = titleImage Global.GetBitmapFromURL ("http://www.domain.com/" + objNewss [позиция] .titleImage); " эта строка кода. Если прокомментировать нагрузку значительно быстрее.

Могу ли я узнать, есть ли у меня какие-либо эксперты для меня? Еще лучше, если можно реализовать асинхронную загрузку, такую ​​как groupon и т. Д., Где она загружается и отображается строка за строкой, которая не будет мешать работе пользователя.

Большое спасибо.

ответ

1

Похоже, что Global.GetBitmapFromURL работает по основной теме. Любой сетевой запрос должен выполняться в отдельном потоке, поэтому вы должны перенести его в AsyncTask или Loader, что решит вашу проблему.

+0

Это предложение действительно улучшает производительность. – teapeng

1

Ваш отказ от использования конструкции. Это копия класса EfficientAdapter, написанного группой разработчиков Android.

При оценке convertView вы должны назначить свои значения holder.

При назначении значения после условий он будет вызываться каждый раз.

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
Display display = wm.getDefaultDisplay(); 

Point size; 

float ratio = -1; 

//calculate the screen size and image ratio 
void float getRatio() 
{ 
    if(ratio == -1) 
    { 
     size = new Point(); 

     display.getSize(size); 

     int width = size.x; 

     ratio = width/320f; 
    } 

    return ratio; 
} 

Bitmap titleImage; 

Drawable news_title_default = context.getResources().getDrawable(R.drawable.news_title_default); 

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

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

     // assign the holder values 
     holder.imageView = (ImageView)convertView.findViewById(R.id.imgTitleImage); 
     holder.textView = (TextView)convertView.findViewById(R.id.tvNewsTitle); 

     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.getLayoutParams().height = (int)(75f * getRatio()); 
    holder.imageView.getLayoutParams().width = (int)(320f * getRatio()); 

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

    if(titleImage != null) 
    { 
     holder.imageView.setImageBitmap(titleImage); 
    } 
    else 
    { 
     holder.imageView.setImageDrawable(news_title_default);  
    } 

    //customizing view 

    holder.textView.setText(objNewss[position].title);      

    return convertView; 
} 
Смежные вопросы