안녕하세요
이미지가 무진장 많이 들어가는 패션관련 SNS 를 만들고 있습니다..
다 만들고 나니...서버쪽에서 받아오는 이미지가 너무 큰 관계로 옛날 폰( 넥서스 원, 겔럭시 에스... 디자이어...)에서 리스트 몇번 보여주고 그리드뷰에 그림 열댓개 보여주면
skia decode--- decoder return false 와 함께
131760-byte external allocation too large for this process.
등등의 "나 힙메모리 모잘라서 죽어요~~~~~~" 라고 하면서 OS단에서 강제적으로 프로세스를 종료해버리네요.
그래서 도입한 방법이, 비트맵을 받아올때 BitmapFactory.Option()에서 isSampleSize를 사용헤서 1/2로 압축해서 받아오고,
겟뷰가 호출될떄마다 claerCache를 해버리는 방법을 사용하니..쫌 버티는듯 하더니만...
그래도 앱을 한 10분 이상 쓰면 메모리때문에 죽어버리네요..
혹시 또다른 방법이 없을까요...-0-
티스토어 검수나...그런것에는 안걸리고 그냥 넘어갔지만..왠지 불안불안해서 수정을 해놓으려 하는데..
딱히 무슨 방법이 생각이 나지 않네요...-0-;
네.. 그렇군요.. 그럼 역시나 리사이클이 리스트뷰 끝날때 해주는게 문제가 될수가 있습니다.
그 액티비티가 끝날때 리사이클을 한다고 해도 intent 플래그 옵션이 걸려 있을경우에
어려 댑스로 왔다가따 할경우 에러가 발생할 수 가 있죠...
예를 들어 canvas가 없다거나,, 메모리 릭이 발생하거나...
위에 말씀하신데로 안쓰는 ImageView에 대해서는 연결된 bitmap을 recycle()을 잘 하시는 방법 밖에 없을 듯 합니다.
그리고 마지막에 질문 하신 내용 중 할당되는 Heap에 대해서는 순수 native heap에 잡히는 것이 아니고, dalvik이 process 별로 잡아 놓은 heap에 bitmap 메모리가 할당 됩니다. (흔히 아는, dalvik.vm.heapsize 로 잡히는 메모리)
http://developer.android.com/training/displaying-bitmaps/index.html
이쪽을 보시면 큰 이미지를 가공하거나
디스크 캐쉬등을 하는 여러 방법이 있는데 한번 해보세요 ^^ 좀 어렵더라고요
옵션을 2로 주셨단말씀이신가? 4내지 8로하면 왠만하시면 메모리릭은 나지 않으실텐데요..
그리고 recycle()을 언제 해주시는가도 중요합니다.
null 처리도 잘 해주셔야하구요...
그런데 recycle() 경우에는 잘못해주시면 다시 그려야할 canvas가 없어져서 null 떨어지는 경우도 있으니깐
주의 하셔야 하구요...
왠만하면 쓰다가 다시 그이슈가 반복된다면 일관성있는 activity 사이클을 유지하시는게 좋습니다.
이왕이면 어떤 액티비티는 불러올때 항상 onCreate로 불려지게 즉 리프레쉬 되는 방식으로요~~