안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요. 매번 도움만 받아가는 낭만폭풍입니다 (__)
앱을 하나 만들고 있습니다. (예전부터..) 앱 자체는 이제 거의 완성단계인데
이게 그림이 여러가지 있고 장면을 전환하며
그 그림에 대한 설명을 해주는.....
간단히 말하자면 책읽어주는 어플 정도로 생각하심 됩니다.
뭐 기본적인 구동은 참 잘됩니다. 근데 이게
장면전환 버튼을 엄청나게 빨리눌러대면 오류가 나서 뻗길래 로그캣을보니
메모리 릭이 발생합니다. 코딩은 싱글톤으로 했기때문에 실행 후
추가로 생성되는 객체는 없어요. 다 재활용하는거구요
(제대로된 싱글톤이 맞는진 모르겠지만 ㅠㅠ)
뭐 이건 버튼을 누르면 clickable이 false되고 일정 시간이 지나야
활성화되게끔 만들어서 어느정도 고치긴 했는데
(물론 이래도 clickable값을 무시하고 맘대로 실행되는 부분이 아주 간혹 있긴 합니다.)
진짜 문제는.......
액티비티를 종료했을때 발생했습니다.
뭐 그냥 종료하면 깔끔하게 잘 종료되는데
실행과 종료를 빠르게 반복하다보면
종료시에 IllegalStateException과 RuntimeException 둘중 하나를 랜덤하게(...)뱉으며
앱이 죽어버립니다.
try - catch문을 써봐도 catch문의 로그가 안찍히는걸 보니 아예 catch문으로 넘어가지도 못하는것 같습니다.
생명주기에 따라 stop과 release 적절히 사용했고요.
(물론 release는 객체의 현재 상태와는 상관없이 제대로 동작하는걸로 알고있습니다만...)
참고로 try - catch문에는 사운드를 끄고 액티비티를 종료하는 코드와 예외 발생시 로그를 출력하는 코드로 되어 있습니다.
테스트시에 전혀 발견하지 못했던 오류였는데
악의적으로 앱을 죽이려고 마음먹고 테스트하니까
귀찮은 에러가 한두가지가 아니더군요 -_-;;
특히 영유아층을 위주로 만들어진 앱이라서
예상치 못한 이상한 조작들에 대해 많이 고려해야 합니다..
그래서 일부러 빽키도 막아놨어요
(지금 티스토어 검증 반려만 4번째입니다. 그것도 갤럭시s 2.1때문에... 원래 갤럭시가 이쪽으로 좀 문제가 많긴 하다지만 어쨌든 검증은 통과해야되니까....)
고수분들의 도움이 필요합니다.
이거 해결해야 스터디도 나갈수 있을듯 ㅠㅠㅠㅠㅠ
* 사운드 리소스는 패키지 내의 raw에 있는거구요. 그래서 별도의 스트림은 사용하지 않습니다.
(다른사이트에는 다 스트림을 닫아야되니 하는 소리들만 하시길래....)
앱을 하나 만들고 있습니다. (예전부터..) 앱 자체는 이제 거의 완성단계인데
이게 그림이 여러가지 있고 장면을 전환하며
그 그림에 대한 설명을 해주는.....
간단히 말하자면 책읽어주는 어플 정도로 생각하심 됩니다.
뭐 기본적인 구동은 참 잘됩니다. 근데 이게
장면전환 버튼을 엄청나게 빨리눌러대면 오류가 나서 뻗길래 로그캣을보니
메모리 릭이 발생합니다. 코딩은 싱글톤으로 했기때문에 실행 후
추가로 생성되는 객체는 없어요. 다 재활용하는거구요
(제대로된 싱글톤이 맞는진 모르겠지만 ㅠㅠ)
뭐 이건 버튼을 누르면 clickable이 false되고 일정 시간이 지나야
활성화되게끔 만들어서 어느정도 고치긴 했는데
(물론 이래도 clickable값을 무시하고 맘대로 실행되는 부분이 아주 간혹 있긴 합니다.)
진짜 문제는.......
액티비티를 종료했을때 발생했습니다.
뭐 그냥 종료하면 깔끔하게 잘 종료되는데
실행과 종료를 빠르게 반복하다보면
종료시에 IllegalStateException과 RuntimeException 둘중 하나를 랜덤하게(...)뱉으며
앱이 죽어버립니다.
try - catch문을 써봐도 catch문의 로그가 안찍히는걸 보니 아예 catch문으로 넘어가지도 못하는것 같습니다.
생명주기에 따라 stop과 release 적절히 사용했고요.
(물론 release는 객체의 현재 상태와는 상관없이 제대로 동작하는걸로 알고있습니다만...)
참고로 try - catch문에는 사운드를 끄고 액티비티를 종료하는 코드와 예외 발생시 로그를 출력하는 코드로 되어 있습니다.
테스트시에 전혀 발견하지 못했던 오류였는데
악의적으로 앱을 죽이려고 마음먹고 테스트하니까
귀찮은 에러가 한두가지가 아니더군요 -_-;;
특히 영유아층을 위주로 만들어진 앱이라서
예상치 못한 이상한 조작들에 대해 많이 고려해야 합니다..
그래서 일부러 빽키도 막아놨어요
(지금 티스토어 검증 반려만 4번째입니다. 그것도 갤럭시s 2.1때문에... 원래 갤럭시가 이쪽으로 좀 문제가 많긴 하다지만 어쨌든 검증은 통과해야되니까....)
고수분들의 도움이 필요합니다.
이거 해결해야 스터디도 나갈수 있을듯 ㅠㅠㅠㅠㅠ
* 사운드 리소스는 패키지 내의 raw에 있는거구요. 그래서 별도의 스트림은 사용하지 않습니다.
(다른사이트에는 다 스트림을 닫아야되니 하는 소리들만 하시길래....)
안드로이드펍 irc에서 동네북을 맡고있는 퐁퐁입니다.
iOS/Android/Python/PHP
타의로 배운 기술은 잘 까먹습니다.. ㅠㅠ
2011.02.24 14:10:02
일단 꿀같은 답변 감사드립니다...ㅠㅠ
싱글톤이란거 배울땐 좀 문제가 있을거같긴 했는데
이게 싱글톤때매 생기는 문제일거라곤 생각을 못했네요 ㅠㅠㅠㅠ이래서 개발자는
넓게 열린 마인드가 필수인가봅니다
알고보니 쓸데없는 리스너가 좀 많이 달려서
그거때문이란 생각을 해서 버튼에 대한 명령을 최소화 시켰습니다.
아예 null로 처리할 수 없는 리스너가 있어서요....
뷰를 null하라고 하셨는데 장면 전환하면서 뷰가 다시 생성되면 거기서 또
메모리 릭이 발생할 여지가 생기지는 않는가요?
우선 리스너 정리 좀 하니까 에러 "빈도"는
이제 일부러 만들긴 많이 힘들정도로 줄어들긴 했습니다만
근성의 앱 학대(...)결과 또 보입니다....이게
오늘안에 답이 안나오면
ApplicationContext에 대해서 공부 좀 해봐야겠네요
싱글톤이란거 배울땐 좀 문제가 있을거같긴 했는데
이게 싱글톤때매 생기는 문제일거라곤 생각을 못했네요 ㅠㅠㅠㅠ이래서 개발자는
넓게 열린 마인드가 필수인가봅니다
알고보니 쓸데없는 리스너가 좀 많이 달려서
그거때문이란 생각을 해서 버튼에 대한 명령을 최소화 시켰습니다.
아예 null로 처리할 수 없는 리스너가 있어서요....
뷰를 null하라고 하셨는데 장면 전환하면서 뷰가 다시 생성되면 거기서 또
메모리 릭이 발생할 여지가 생기지는 않는가요?
우선 리스너 정리 좀 하니까 에러 "빈도"는
이제 일부러 만들긴 많이 힘들정도로 줄어들긴 했습니다만
근성의 앱 학대(...)결과 또 보입니다....이게
오늘안에 답이 안나오면
ApplicationContext에 대해서 공부 좀 해봐야겠네요




싱글톤은 어쩔수 없이 static을 많이 쓰게 되는데 static 자체는 문제가 되지 않으나,
static 객체가 속성으로 물고있는 다른 객체가 뷰 혹은 엑티비티가 될수 있습니다.
이 경우 static 객체가 소멸하지 않으므로 뷰혹은 액티비티가 정리가 안되는 경우가 생깁니다.
이게 가장 치명적인 메모리 릭입니다. 보통 싱글톤은 사운드 재생하는 클래스나
전체로직을 Manage하는 클래스에 많이 쓰는데요... 여기서 잘 확인해야 합니다.
리스너 같은건 안쓸때 항상 null로 두시구요... 뷰나 액티비티를 참조할 가능성이 있는 변수는
뷰쪽은 null 처리 확실히 하시고(안쓸때...), 액티비티는 액티비티 대신 ApplicationContext를 쓰는게 좋습니다.