안드로이드 개발 질문/답변
(글 수 45,052)
ImageView imgMain = (ImageView)findViewById(R.id.img_main);
while("리스트 사이즈만큼") {
imgMain.setImageBitmap(urlTobitmap("이미지리스트URL"));
}
public static Bitmap urlTobitmap (String _photoURL){
URL url = null;
Bitmap bitmap = null;
try {
url = new URL("_photoURL);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
bitmap = BitmapFactory.decodeStream(url.openStream(), null, options);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bitmap;
}
위와같이 이미지 리스트URL을 받아와서 이미지 뷰에 뿌리는 작업입니다.
이상한건.... png파일은 잘 보이는데...jpg 파일은 안보이는 겁니다...
그래서 뭐가 문제이가 하고 디버그 모드로 브레이크포인트를 걸어서 해보니...
jpg파일이 제대로 표시가 되는겁니다... (결국 로직엔 문제가 없는걸로 생각하고...)
왜 그런걸까요?
바로 실행하면 jpg형식 파일은 안보이고.. 디버그 모드로 하면... jpg파일이 보이는 현상...
저 로직 문제인가요???
고수님들 도와 주세여~!
2011.06.28 14:55:14
@도카
도카님.. 정말 감사합니다. 저도 뭔가 과부하 문제일거라 생각은 했습니다.
이상한건.... 이미지URL에 있는 그림은 그다지 큰 그림들이 없기에... 설마 과부하 일까 생각했습니다.. (전부 작은 이미지 거든요...)
덕분에 스키아라는걸 공부좀 해봐야겠습니다.
바쁘실테데 댓글을 주셔서 감사합니다.
2011.07.13 11:04:44
좀 지난 글 이지만..
윗글에서 도카님께서 "스키아"를 언급해 주셔서 해결 할 수 있었습니다.
대체나 로그를 보니... 스키아 라는게 있더군요...
skia decoder- decode returned false
그런데 디코더 리턴이 펄스라....쩝.... 구글신으로 검색을 해보니..
이미지를 다~ 받기전에 디코더를 닫아버리는데서 발생하는 문제라더군요.
그래서 검색 후에 위의 메쏘드를 아래와 같이 수정후... 잘 됩니다.
/**
* 문자열 URL의 주소를 bitmap으로 변환 후 반환
* @param _photoURL : 이미지http문자열
* @param _size : n/1사이즈 설정
* @return
*/
public static Bitmap urlTobitmap(String _photoURL, int _size) {
URL url = null;
Bitmap bitmap = null;
try {
url = new URL("_photoURL);
HttpGet httpRequest = null;
try {
httpRequest = new HttpGet(url.toURI());
} catch (Exception e) {
e.printStackTrace();
}
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpclient
.execute(httpRequest);
HttpEntity entity = response.getEntity();
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
InputStream instream = bufHttpEntity.getContent();
bitmap = BitmapFactory.decodeStream(instream);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bitmap;
}




안녕하세요 고수는 아니지만, 같은 경험을 해본 입장에서 살짝 도움을 드리자면, 안드로이드의 경우, 스키아라는 디코더를 사용합니다. 이 디코더가 소프트웨어 디코더이기 때문에 이미지 크기에 따라 디코딩 시간이 차이가 많이 나는 편입니다.
문제로 보이는 코드는 inSampleSize 가 4로 고정되어있는 부분입니다. 이 부분은 고정하지마시고 이미지 크기를 받아서 상황에따라 변경해주는 방법을 쓰시는 것이 좋아보입니다. 참고하실만한 소스는 Gallery3D 에 UriTexture라는 클래스가 있는데 해당 클래스를 보시다보면 해답을 찾으실 수 있을 것 같습니다.
또한, 위와같이 크기에 따라 값을 변경해주신다해도, 이미지가 어마어마하게 크다면(과부하 테스트할때 200메가 이미지로 테스트해본 적이 있습니다) 똑같은 문제가 생깁니다. 이 부분도 위에 나온 클래스에서 어느정도 해답을 찾아보실 수 있는데, 디코딩시 쓰레드를 생성하여, 6초이상 걸릴 시에는 디코딩을 캔슬시키고, 다시 디코딩을 시도하게 하는 코드가 있습니다. 이 부분은 스키아가 순간적으로 디코딩이 쌓여, 과부하 걸려있을때를 위해 이런 코드를 사용합니다.
마지막으로, while 문 안에 sleep(100) 을 추가해주시면 과부하가 조금은 덜어질 것으로 보입니다.
브레이크 포인트를 걸었을때 정상적으로 보이는 것은 브레이크 포인트로 하나씩 지나가기때문에 디코더에 과부하가 걸리지 않아서
그렇습니다.
도움이 되셨으면 좋겠네요