어떠한 url들에게서 이미지 경로를 다운 받아 와서 Bitmap으로 decodeStream하고 그 비트맵을 setImageBitmap으로 세팅했습니다.
근데 그 이미지들이 우선 그렇게 작은 사이즈 들도아니고 한번에 30~40장을 받아오다보니 몇장 넘기다 보면 메모리부족 에러로
꺼집니다.. 뭐..BitmapFactory 옵션에서 SampleSize나 그런 방법은 모두 찾아보았는데.. 이미지의 화질이 떨어지면안되는 관계로
사용하지못하고 화면에 뿌려주기전 미리 모든 이미지들을 변환해놓고 세팅만하게해도 에러가나서
멘붕상태입니다..
서칭하다보니 BitmapFactory에서 Decode할시에 구글에서도 인정한 메모리 누수 이슈가 있더군요...
그래서 다른방법을 찾아보려고 하고있습니다
결론적으로 어떠한 url에서 Bitmap으로 변환시키는 방법이 BitmapFactory를 사용하는 방법밖에없는건지..
혹시 Drawable객체인가?그걸로도 변환이가능한지..
아니면 다른방식으로 url에서 이미지를 가져와서 Bitmap으로 변환하는 방법이있는건지 궁금합니다.
혹시 방법이있다면 알려주시면 정말정말정말 감사하겠습니다 ㅠㅠ
file 로 된 이미지를 바로 imageview 에 넣기만 하면 되는건가요?
만일 그런거라면..
setImageDrawable(Drawable.createFromPath((String)file_path));
메모리 제거는 setImageDrawable(null) 로 하시면 됩니다.
그리고 뭐 아시겠지만..
메모리가 한정적이기 때문에 고용량의 이미지들은 화면에 뿌려지기 직전에 로딩하는 방식을 취하셔야 하지 않을까 싶네요.
저도 이런 문제 때문에 여러번 어려움을 겪었고 현재도 겪고 있어서 참 그 마음 이해가 가네요..ㅠㅠ
정확하게 어떤 앱을 만드시는지 잘 몰라서 정확한 얘기가 아닐수도 있지만 제 기준으로 리플 남겨봅니다.
어차피 모든 이미지를 로드하고 세팅했을때 앱이 뻗는 결과가 발생한다면,
일부의 이미지들만 화면에 보여주는 방식을 취해야하는게 아닌가 싶네요. 일부만 보여준다는건 나머지들은 어디엔가 저장시켜둬야하는데, 메모리(RAM)를 아끼기 위해서는 file 로 캐쉬(내장/외장) 폴더에 저장시켜놓고 필요할때 불러서 쓰고 필요없을때는 메모리에서 지우는 방식을 취해야 안정적이지 않을까요? file 로 저장시키고 이를 로드하는 추가적인 부하가 걸리겠지만.. 이게 엄청난 오버로드를 발생시키는 작업도 아니고요. 파일로 저장 시켜둠으로써 이미지의 사이즈 변환도 용이하고 원본 이미지를 복구하기도 용이하다는 장점도 있고요.
물론 제 지식이 짧기 때문에 다른 더 좋은 방법이 있을수도 있지만.. 저는 그러한 문제들을 이런방식으로 해결하고 있습니다.
지금 현재 상태는 한액티비티에서 리스트어댑터를 연결해서 포지션이 바뀔때마다 그 배열에있던 이미지 url을 하나씩가져와서 뿌려주는 겁니다.. 간단히 리스트뷰에 어댑터 붙인거랑 비슷하다고 생각하시면되는데..
스크롤할때마다 getView가 호출되면 그겟뷰에선 이미지뷰 초기화하고,, 어댑터붙일때의 그배열의 인덱스값을 getView의 포지션값과 매칭시켜서 겟뷰호출할때마다 다른 이미지 url을가져옵니다
그url을 가져오면 Bitmap으로 변환하고 이미지뷰에 뿌려주는겁니다..
근데문제는 한포지션20번까진 괜찮은데.. 그이후에도 메모리가 계속 쌓이는지.. 20번이후로는 메모리부족으로 강제종료됩니다..




안녕하세요.
동일한 조건은 아니지만 이미지를 많이 쓰는 어플 개발중에 메모리 문제로 많이 힘들었습니다.
http://www.androidpub.com/1282821
근본적으로 이미지의 경우 recycle()이 기본적으로 들어가지만
위 내용중 2번에 해당되는 내용이 많은 도움을 주었습니다.
이미지의 질이 조금은 떨어지겠지만 눈으로 보기에 괜찮다면 적용해 보시는것도 좋을것 같습니다.