본문으로 바로가기
반응형

Fragment를 사용하면 부모 Activity의 Context가 필요할 때가 있다.

Context의 종류에는 여러 종류가 있지만 보통 우리가 필요한 Context는 Activity의 Context다
(Activity의 Context는 일부 Context 보다 덩치가 크므로 옛날에는 때에 따라서 적절한 Context를 쓰는게 메모리 관리나 최적화 측면에서 좋았지만 기기성능이 매우 좋아진 요즘은 괜히 Activity가 아닌 Context를 썼다가 앱이 Crash되는 현상이 생기므로 Activity의 Context를 주로 사용하는것을 추천한다)

Fragment에는 getActivity()라는 함수가 있다. 함수명 그대로 부모 Activity의 context를 가져오는 함수다.
해당 함수로 앱을 열심히 만들고 배포하면 Play Store 로그에 해당 부분에서 NullPointerException 로그가 많은 것을 알 수 있다.

getActivity()는 부모의 Acitivty를 가져오지만 때로는 Null을 가져온다.
마찬가지로 getContext()도 Null이거나 Activity가 아닌 Context를 가져와서 Null을 발생시킨다.

따라서 우리는 해당 Fragment에 부모 Activity를 강한 참조(Strong) 시켜둬야 안전하게 앱을 사용할 수 있다.

Fragment가 생성되어서 Activity에 붙을때 onAttach라는 함수가 생성된다

onAttach(Activity activity)는 deprecated되었고 onAttach(Context context)를 사용하면 된다.
private Activity a;

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    if (context instanceof Activity) {
        a = (Activity)context;
    }
}

다음과 같이 Activity를 미리 정의하고 onAttach에서 Context가 Activity면 a에 할당을 해서 강한 참조를 만들어 버린다.

그 뒤로 해당 a를 사용하면 안전하다.

반응형