ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [안드로이드] Fragment 바인딩 메모리 누수
    카테고리 없음 2024. 4. 23. 09:29

    메모리 누수?

    Fragment에서 바인딩을 사용 시 View보다 Lifecycle이 길어서 발생하는 문제이다.

    아래처럼 코드를 짜면 Fragment가 사라질 때 제때 가비지컬렉터에 잡히지 않아서 메모리 누수가 발생하게 된다.

    class ContactDetailFragment : Fragment() {
    
        private lateinit var binding: FragmentContactDetailBinding
    
        override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View {
            binding = FragmentContactDetailBinding.inflate(inflater, container, false)
            return binding.root
        }
    }

    해결법

    안드로이드 공식 문서에 나온 방법이다.

    (구글에선 위임을 사용하거나 아니면 라이브러리를 사용하는 방법도 있다.)

     

    _binding을 null로 선언 후 onCreateView에서 _binding을 참조시켜주고
    onDestroyView에서 _binding을 null로 만드는 방법이다.

    (이렇게 해야 Fragment가 종료될 때 가비지 컬렉터가 수거해간다.)

     

    binding!!을 사용할 때 문제가 없는 이유는
    보통 우리는 onViewCreated에서 View를 세팅해준다.

    사실상 해당 시점에는 binding을 null이 아니기 때문에 문제 없이 사용할 수 있는 것이다.

    class ContactDetailFragment : Fragment() {
    
        private var _binding: FragmentContactDetailBinding? = null
        private val binding get() = _binding!!
    
        override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View {
            _binding = FragmentContactDetailBinding.inflate(inflater, container, false)
            return binding.root
        }
        
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            binding.profileImageView.setImageResource(R.drawable.test_image) // 문제 없음!
        }
    
        override fun onDestroyView() {
            super.onDestroyView()
            _binding = null
        }
    }
Designed by Tistory.