-
[ANDROID] LEAKCANARY dictionaryANDROID 2021. 12. 27. 14:59
글을 쓰는 이유.
leak canary는 메모리릭이 어디서 발생 되었는지는 나오나 정확한 이유는 찾기 어렵다.
때문에 내가 전에 발생시켰던 릭들은 언제가 다시 발생할 가능성이 높다. 때문에 릭이 났던 원인을 정리하고 참고 하기 위해
릭을 정리한다.
메모리 릭이 발생하는 경우
- 액티비티의 컨텍스트를 필드로 저장한느 것. 설정(configration 변경으로 인해 액티비티가 재 생산 되는 경우.
- 객체의 라이프사이클을 가지고 있는 리스너, 브로드캐스트 리시버 RxJava subscription을 등록하고 라이프 사이클이 끝났을 때 해지하지 않은 경우
- 뷰를 정적 필드에 저장하고 뷰가 해제 될때 필드를 지우지 않은 경우
- viewModel에서 context를 사용하는 경우. (viewModel의 라이프 사이클이 view보다 길기 때문)
view종료시 viewDataBinding = null 로 초기화 하지 않아서.
protected val compositeDisposable = CompositeDisposable() private var _viewDataBinding: VD? = null protected val viewDataBinding: VD get() = _viewDataBinding ?: throw IllegalArgumentException("viewDataBinding can not be null") ... override fun onDestroyView() { compositeDisposable.clear() _viewDataBinding = null super.onDestroyView() }view종료시 viewPager의 adapter를 detach하지 않아서.
override fun onWillDetachViewModel( viewDataBinding: FragmentInitBinding, viewModel: InitViewModelType ) { with(viewDataBinding) { vp.adapter = null } super.onWillDetachViewModel(viewDataBinding, viewModel) }view종료시 viewPager2에 붙어있는 tablayout을 초기화하지 않아서.
@AndroidEntryPoint class InitFragment: ...... { private var tabLayoutMediator: TabLayoutMediator? = null ... override fun onWillDetachViewModel( viewDataBinding: FragmentInitBinding, viewModel: InitViewModelType ) { super.onWillDetachViewModel(viewDataBinding, viewModel) with(viewDataBinding) { vp.adapter = null tabLayoutMediator?.detach() tabLayoutMediator = null } } }'ANDROID' 카테고리의 다른 글
[ANDROID] kakao login 리젝, 소셜 로그인 리젝, playstore (1) 2022.08.26 [ANDROID] AppbarLayout + tablayout + viewPager2 Scroll issue (Bug) 스크롤 이슈 (버그) (0) 2022.07.09 [Android] SingleLiveEvent(SingleLiveData) 정리 (0) 2022.04.28 [ANDROID] gson progaurd-rules (0) 2022.01.17 [ANDROID] DiffUtil.ItemCallback + ListAdapter (0) 2021.12.02