마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

커스텀 리스트뷰[그리드뷰형식] 비트맵 버벅임.

0 추천
public View getView(int position, View convertView, ViewGroup parent) 
		{
			final ViewHolder holder; // 추가
			if (convertView == null) 
			{
				holder = new ViewHolder();
				convertView = mInflater.inflate(R.layout.galleryitem, null);
				holder.imageview = (ImageView) convertView
						.findViewById(R.id.thumbImage);
				holder.checkbox = (CheckBox) convertView
						.findViewById(R.id.itemCheckBox);
				convertView.setTag(holder);

			} 
			else 
			{
				holder = (ViewHolder) convertView.getTag();
			}
			holder.checkbox.setId(position);
			holder.imageview.setId(position);
			
			BitmapFactory.Options bo = new BitmapFactory.Options();
			bo.inSampleSize = 2;
			bmp = BitmapFactory.decodeFile(bmpArray.get(position), bo);
			//이미지 가로,세로길이 구하기
			int bmpW = bmp.getWidth();
			int bmpH = bmp.getHeight();
			resized = Bitmap.createScaledBitmap(bmp, bmpW, bmpH, true);
			
			holder.imageview.setImageBitmap(resized);// 
			holder.checkbox.setChecked(selection[position]);//
			holder.id = position; 
			return convertView;
		}

위와같이 겟뷰 코드를 작성했습니다.

현재 그리드뷰형식[바둑판] 커스텀 리스트뷰에 비트맵 이미지를 출력하는데..

스크롤할 때마다 버벅이네요; 파일크기는 다 크지 않고 최대 해상도도 700x700수준입니다..

재사용문제인걸 들었는데..제 생각으론 

아래의 BitmapFactory.Options bo = new BitmapFactory.Options(); 부분부터

setimagebitmap이 문제인거같은데요..이미지 로드할 때 효율적으로 불러오는 방법이 있나요?

 

망고사탕 (5,000 포인트) 님이 2015년 10월 30일 질문

2개의 답변

+1 추천
안드로이드 비트맵은 생각보다 많이 큽니다 700*700*4바이트. 줄이는 과정에서 속도저하가 있구요..

몇가지 방법이 있습니다

하나는 틀만 먼저 싹 로딩하고, 안의 이미지는 스레드에서 로딩하다 로딩되는 순서대로 이미지뷰에 뿌려주는 방식입니다. 갤러리들 보시면 검은 이미지 먼저 나오고, 사진 로딩되는 그런 느낌입니다.
물론 메모리 관리(리사이클이나 null 등..)해주셔야 안 뻗을거구요.
 

그걸 구현하기 복잡하시거나, 더 향상된 퍼포먼스를 원하시면

이미 구현된 이미지 로딩 라이브러리를 쓰시면 됩니다.

좋은 이미지 로더가 오픈 소스로 많이 풀려있습니다.

페이스북에서 사용하는 이미지 로더도 공개되어 있구요.

이것에 대해선 잘 설명된 페이지가 있습니다. 참고하세요.

http://d2.naver.com/helloworld/429368

여기입니다.
Andromer (1,360 포인트) 님이 2015년 10월 31일 답변
0 추천
버벅거리는 이유는 UI 스레드에서 이미지를 읽어들이는 작업을 하기 때문에 그렇습니다. 보통 많이 쓰는 방법을 말씀드리면, 아래의 방법을 사용합니다.

1. 이미지 로딩을 스레드(예로 AsyncTask등을 사용)를 사용한다.

2. LruCache<Bitmap>를 사용해서 메모리 캐시를 1차로 사용한다.

그래서, Bitmap과 관련된 부분을 AsyncTask로 분리하시고, getView에서 Cache를 확인해서 있으면 ImageView에 바로 붙이고, 없으면 AsyncTask로 처리를 위임하시는 형태로 구현하시면 됩니다.
mcsong (44,040 포인트) 님이 2015년 10월 31일 답변
...