Я использую пользовательский просмотр списка, чтобы показать изображение и текст. Ниже представлен файл макета для моего элемента списка просмотра и кода. Я объясню свою проблему в нижней части сообщения.Предложение по улучшению производительности 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 и т. Д., Где она загружается и отображается строка за строкой, которая не будет мешать работе пользователя.
Большое спасибо.
Это предложение действительно улучшает производительность. – teapeng