ListView가 아닌 scrollView로 썸네일을 만들려고 합니다.
아래로 계속 내리다보면 scrollView에서 위치를 표시해 주는 바의 위치에 따라서
새로운 이미지를 서버에서 다운받아서 계속 뿌려주는식의 프로그래밍을 하려고 합니다.
처음에 50개를 호출해서 스크롤을 아래로 내리면 처음에 있었던 50개는 메모리 해제 되고
새로운 50개를 호출합니다.
이 부분에서 이전 50개의 이미지 메모리를 해제하려고 recycle()함수를 사용하였습니다.
((BitmapDrawable)(imageView.getDrawable())).getBitmap()로 해당하는 이미지뷰에서 이미지를 받아오고
해제하려고 하는데. 아무리 해제를 해도 결국 out of memory메세지가 뜹니다.
제 생각에는 이미지를 서버에서 받아오는 과정에서
BufferedInputStream bis = new BufferedInputStream(conn.getInputStream(), nSize);
bitmap = BitmapFactory.decodeStream(bis);
이부분에서 BitmapFactory가 메모리 릭을 계속 내고 있는것이 아닌가 생각하고 있습니다.
stream에서 이미지파일로 변환하는 과정에서 BitmapFactory를 다른것으로 대체할 수 있을까요?
Drawable처럼 메모리릭이 안나고 stream 변환 과정에서 이미지를 가져오는 방법을 알고 싶습니다.
프로그램의 전체적인 루프는 이렇습니다.
1 . 이미지뷰를 50개 생성한다.
2 . 이미지뷰를 한개 생성할때 마다 스레드로 이미지 다운로드를 한다.
3 . 스레드는 AsyncTask이며 이미지 다운로드를 다 한후 UI스레드에 이미지를 넘겨주어 미리 생성되어진
이미지뷰에 넣어준다.
4 . AsyncTask는 이미지 하나를 생성할때마다 새로 생성된다. 50개의 이미지를 불러올때 50개 생성.
5 . 스크롤을 아래로 내린다. 전체 높이의 90%까지 왔을 경우
6 . 새로운 이미지 50개가 생성되고, 이전 이미지 50개는 recylce() 한다.
도와주세요 고수님들~
p.s trying to use a recycled bitmap 이란 에러가 왜나는지에 대해서 조금 자세하게
설명해주세요~
메모리릭이아니라 메모리 부하가 엄청심할거같은데요..
이미지뷰50개 생성한다는것자체가 메모리 부하가 심할거같구요..
50개에 이미지를 붙이기위해 50장의 이미지를 준비해야할텐데 몇장만 가져와도 뻗을거같네요..
스크롤뷰로 이미지 생성하는것보다 리스트뷰에 넣어주는게 더 낫지 않을까요?
논외로하고, bitmap으로 넣을땐 samplesize로 한번더 줄여주시구요..
이미지뷰50개가아니라 이미지뷰 몇개를 만들어서 계속 재사용하는 방식으로 하는게 나을듯싶습니다.
화면에 이미지뷰가 2개까지 보여진다면, 넉넉잡아서 4개정도만들고 드래그해서 내릴때 3,4번보일때 1,2번이미지뷰를 밑에다붙여서 비트맵 다시 다른걸로 붙여주구요..
비트맵도 그때그때 재사용해서 붙여주는게 나을듯싶네요.
한번에 이미지뷰 50개 비트맵50개를 다 생성하지마시구 몇개씩 만들어서 재사용해보세요~




cache를 사용해서 자동으로 파일갯수/용량설정 을 지정해서 업데이트 하시면 50개든 100개든 사이즈에 맞게 recycle을 줄 수있을 것 같습니다.
recycle오류는 이미 recycle되었거나 recycle된 이미지를 사용하려고 하면 에러가 나긴 합니다만...에러는 검색을..