onCreate 초반부분에서 xml파싱을 통해 데이터를 얻어와서,
listview세팅을 하고
GetView()부분에서 파싱해온 썸네일 이미지 URL을 통해 리스트에 이미지를 출력해 주는데요..
잘 나오는데..
문제는 속도가 너무 느리고, 스크롤조차 잘 되질않네요.
썸네일 이미지 크기가 30*30인데도 저렇게 느린거보면 다른 별개의 문제 같은데요.
원인 파악이 잘 되질않아서, 도움을 요청하게되었습니다.
아래부분은 이미지출력시 사용하는 소스입니다.
보완해야 할 점이 있다면 알려주시면 감사하겠습니다..
/**
* URL Bitmap
* @param urlStr
* @return
*/
public Bitmap loadBitmap(String urlStr){
Bitmap bitmap = null;
try{
URL url = new URL(urlStr);
InputStream is = url.openStream();
bitmap = BitmapFactory.decodeStream(is);
bitmap = Bitmap.createScaledBitmap(bitmap, 30, 30, true);
is.close();
}catch(Exception e){
;
}
return bitmap;
}
/**
* Bitmap ImageDownload
* @param urlStr
*/
public Bitmap ImageDownload(String urlStr){
int nReadByte = 0;
byte[] Data = new byte[1024];
Bitmap bitmap = null;
try {
URL Url = new URL(urlStr);
URLConnection URLConn = Url.openConnection();
InputStream is = URLConn.getInputStream();
FileOutputStream fos = new FileOutputStream("/sdcard/media/image.bmp");
while((nReadByte = is.read(Data)) != -1) {
fos.write(Data, 0, nReadByte);
}
File file = new File("/sdcard/media/image.bmp");
Uri uri = Uri.fromFile(file);
bitmap = Images.Media.getBitmap(getContentResolver(), uri);
bitmap = Bitmap.createScaledBitmap(bitmap, 80, 80, true);
is.close();
fos.close();
}catch (IOException e) {
// Error
}
return bitmap;
}
하지만 .bmp파일 같은 경우 용량이 1메가가 초과할 경우 SDCard에 다운로드 받아서 출력해주지 않으면
출력이 되질 않더라구요..
createScaledBitmap은 혹시나 픽셀을 줄이면 속도가 빨라질까해서 사용해본 함수입니다..
근데 개선되질 않네요;;
다른 언급이 없으신걸로보아 loadBitmap 메소드를 main thread (ui thread) 에서 실행하신거 같네요..
그러니 스크롤도 안되고 화면이 얼어버리는거죠
이러한 처리는 다른 쓰레드에서 실행하셔야합니다.
기본적인 사항이지만 말씀드리자면 안드로이드의 코드는 전부 main thread에서 동작합니다.
main thread는 질문하신분꼐서 입력한 코드 (이미지 다운같은거) 뿐만아니라 ui를 그리는 작업도 담당합니다.
그 쓰레드에서 이미지를 다운받는 동작을 실행시키니 ui를 그릴수가 없는 상태가 되어 멈춰버리는겁니다.
이러한 작업은 따로 thread를 생성하여 비동기적으로 처리하여야합니다.
thread나 안드로이드의 AsyncTask 같은것들을 이용하여 다운로드 로직을 처리하도록 하세욤~



