티스토리 뷰

Mobile/Android

[Android]Context의 오용

out of coding 2015. 3. 27. 10:55

안드로이드에서 Context는 정말 두번째라면 서러울만큼 많이 사용하는 요소중에 하나입니다.

그래서 문제는 오용하는 경우가 발생한다는 것이죠.


각 Component에서 Context를 사용할 경우에 대한 내용입니다.

1. Application 

: 어플리케이션의 유일한 Context. 유일하게 존재하여서, Application이 존재할 경우에 대해서, 사용이 가능함

2. Activity/Service 

: ContextWrapper를 상속받아 구현한 Context. 프레임워크는 Activity나 Service가 실행 될 때 기본 Context에 필요한 정보를 넣어주며,자신만의 고유한 Context를 가짐

3. BroadcastReceiver

: 자신이 Context는 아니지만. onReceive에서 Context를 가지고 있게됨. 이 경우 Context는 ReceiverRestrictedContext이며, registerReceiver와 bindService를 사용할 수 없음.

4. ContentProvider

: 자신이 Context는 아님. 사용시에는 getContext()를 통하여 Context를 가져올 수 있으며, 동일한 응용프로그램에서 호출시 동일한 Singleton instances를 반환하나, 별도의 앱이거나 프로세스가 다른 경우에는 실행되는 응용프로그램의 Singleton instances를 반환한다.


Context를 사용할 경우에, 잘못 사용하는 부분들이 존재하게 되는데 라이프 사이클을 가지고 있는 Component들에서 자기 자신의 Context를 넣어주는것입니다.

예를 들면 Singleton 패턴으로 사용할 경우를 들수 있습니다.


1. 직접적으로 Context를 사용하고 있어서, lifecycle이 끝날 경우에, 참조를 하고 있어서 메모리에서 날아가지 않게됨.

public class Singleton {

	private static Singleton INSTANCE;
	private Context mContext;
	
	public static Singleton getInstance(Context context) {
	
		if(INSTANCE == null) {
			INSTANCE = new Singleton(context);
		}
		
		return INSTANCE;
	}

	private Singleton(Context context) {
	
		mContext = context;
	}
}


2. Dialog등을 사용하지 않는 경우에는 다음과 같이 ApplicationContext를 사용하도록 합니다.

public class Singleton {

	private static Singleton INSTANCE;
	private Context mContext;
	
	public static Singleton getInstance(Context context) {
	
		if(INSTANCE == null) {
			INSTANCE = new Singleton(context.getApplicationContext());
		}
		
		return INSTANCE;
	}

	private Singleton(Context context) {
	
		mContext = context;
	}
}

위와 같이 lifecycle을 사용하는 녀석들은 참조를 ApplicationContext를 사용하게 하여서, 메모리 릭이 발생하지 않도록 합니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
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 28 29 30
글 보관함