SingleTon Class처럼 오래사는 인스턴스에게 가끔 context를 넘겨줘야할 상황이 있을수도있다.
그러나 엄청난 주의가 필요하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public class SingletonLeakActivity extends AppCompatActivity {
private SingleTonClass stc;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_static_ref_leak);
stc = SingleTonClass.getInstance(this);
}
}
class SingleTonClass {
private Context mContext;
private static SingleTonClass instance;
private SingleTonClass (Context context) {
mContext = context;
}
static synchronized public SingleTonClass getInstance(Context context) {
if (instance == null)
instance = new SingleTonClass(context);
return instance;
}
}
|
cs |
위의같은경우라면 SignleTonClass 인스턴스가 SigleTonLeakActivtiy의 context를 계속 쥐고있는 상황이생겨
액티비티가 종료되어도 GC가 수거를 못할수도 있게된다.
이럴땐 2가지 솔루션이있다.
1.this대신 getApplicatoinContext()를 넘겨주는것이다. Applicatoin이 살아있는동안의 context이고 액티비티들의 라이프사이클과 관련이없기때문이다.
use the Application context. This context will live as long as your application is alive and does not depend on the activities life cycle.
결론=> 오래살아야하는 인스턴스중 context가 필요하다면 application-context를 넘겨주는게 좋다. (activity-context를 넘겨주지마라)
2.하지만 액티비티의 라이프사이클이 필요해서 this / activity-context 넘겼다면 어떻게해야할까?
명시적으로 null처리를 잘해야한다. 위의예제같은경우는 액티비티(컴포넌트)가 onDestroy될때 싱글톤객체에게 context를 null로 만들도록 명시적으로 처리를 해줘야 할 것이다.
참고
http://sunphiz.me/wp/archives/tag/applicationcontext
https://android-developers.googleblog.com/2009/01/avoiding-memory-leaks.html
context에 대한설명과 메모리 leak
'안드로이드 > Memory Leak' 카테고리의 다른 글
4. memory leak 회피방법: 익명클래스를 주의하라 (0) | 2019.08.12 |
---|---|
3. memory leak 회피방법: Inner Class Reference를 주의하라 (0) | 2019.08.11 |
non static inner class를 memory 해제를 할 순 없을까? (1) | 2019.08.11 |
Static inner class를 쓰는이유는 무엇일까? (0) | 2019.08.11 |
1. memory leak 회피방법: static 변수에 activity와 view를 담지마라 (0) | 2019.08.11 |