안드로이드 개발 질문/답변
(글 수 45,052)
c를 주로 했는데 자바로 안드로이드 개발하려니 막히는게 한두가지가 아니네요.
질문 1.
Spinner를 사용하는데 이 내용을 동적으로 바꿔줘야할 일이 있어서요
결국은 어댑터를 새로 만들어주는 방법이 있는것 같은데
ArrayAdapter<CharSequence> adspin;
adspin = new ArrayAdapter<String>(Book.this, android.R.layout.simple_spinner_item, alList);
최초에 이런식으로 만들고
나중에 다시
adspin = new ArrayAdapter<String>(Book.this, android.R.layout.simple_spinner_item, alAnotherList);
형식으로 다시 생성하여 할당하면 변경돼서 동작은 하는데
문제는 이렇게 한 변수에 new로 또 생성했을 경우 GC가 동작하나요 아니면 자동으로 이전 변수에 대해 delete가 이루어지나요?
c처럼 명시적으로 delete가 있으면 차라리 좋겠는데 도무지 알수가 없네요.
아니면
adspin.clear()
adspin = null;
정도로만 해도 GC가 해제해 주는걸까요...
질문 2.
메모리 릭이 있는지 체크하는 방법이 있나요?
질문 1.
Spinner를 사용하는데 이 내용을 동적으로 바꿔줘야할 일이 있어서요
결국은 어댑터를 새로 만들어주는 방법이 있는것 같은데
ArrayAdapter<CharSequence> adspin;
adspin = new ArrayAdapter<String>(Book.this, android.R.layout.simple_spinner_item, alList);
최초에 이런식으로 만들고
나중에 다시
adspin = new ArrayAdapter<String>(Book.this, android.R.layout.simple_spinner_item, alAnotherList);
형식으로 다시 생성하여 할당하면 변경돼서 동작은 하는데
문제는 이렇게 한 변수에 new로 또 생성했을 경우 GC가 동작하나요 아니면 자동으로 이전 변수에 대해 delete가 이루어지나요?
c처럼 명시적으로 delete가 있으면 차라리 좋겠는데 도무지 알수가 없네요.
아니면
adspin.clear()
adspin = null;
정도로만 해도 GC가 해제해 주는걸까요...
질문 2.
메모리 릭이 있는지 체크하는 방법이 있나요?
2011.01.20 09:16:23
GC가 발생을 하는 걸로 알고 있는데... 어느 시점에서 일어나는지 알수는 없을 겁니다. 강제적으로 하는 법이 있었던듯 없었던듯... 저도 여지껏 웹개발을 하다보니 GC가 어느 시점에서 일어나는 지는 별로 신경을 안썼는데... 앱에서는 역시 생각해야 겠지요? 음...
2011.01.20 15:02:00
일단 adapter 관련 클래스는 clear 메소드도 존재하고, 데이타를 다시 설정하는 메소드도 존재합니다.
그리고 데이타를 변경하셨으면, adapter 클래스에 notify어쩌구 저쩌구 메소드가 있습니다.
그걸 호출해주시면 변경된 데이타가 반영이 됩니다.
그리고 GC에 경우는 데이타를 안쓴다고 해서 바로 GC가 일어나지는 않습니다.
힙 영역 메모리가 일정 %를 넘었을 경우(예를 들면 95%)에만 GC가 일어납니다.
그리고 또 안 쓰는 데이터 전부를 GC 하는것도 아니고, 힙의 %까지만(예를 들면 50%) GC를 시켜줍니다.
이유는 Major GC 시간이 길면 안되기 때문이죠..
자바에서는 Major GC를 stop the world(정확한지는 모르겠음) 라는 별칭으로 부릅니다.
그만큼 Major GC가 호출될때마다 해당 어플은 아무것도 안하고 멈추게 됩니다.
가급적이면 저렇게 대량의 데이터를 전부 바꾸시는 것보단 변경된 데이타만 뺴주고
넣어주시는 방향으로 처리하시는게 낳을꺼 같습니다.