24.01.03 프래그먼트 바인딩 방식의 차이

KSang·2024년 1월 3일
0

TIL

목록 보기
24/101

그 외 복습

리사이클러뷰 뷰바인딩 어댑터뷰 프래그먼트
다이얼로그 알림

프래그먼트 바인딩 방식의 차이

private val binding by lazy { FragmentFirstBinding.inflate(layoutInflater) }
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return binding.root
}
private var _binding: FragmentSecondBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentSecondBinding.inflate(inflater,container,false)
// Inflate the layout for this fragment
return binding.root
}
  1. 첫 번째 방식에서는 lazy 위임을 사용하여 FragmentFirstBinding 객체를 초기화함.
    이 방식은 프래그먼트의 뷰가 생성될 때까지 바인딩 객체의 초기화를 지연시킨다.
    그러나 onDestroyView에서 바인딩 객체를 null로 설정하지 않기 때문에 메모리 누수가 발생할 수 있다.
    프래그먼트의 뷰가 파괴되더라도 바인딩 객체는 계속 메모리에 남아있을 수 있기 때문.
    간편해서 실무에서도 자주쓰는 방식이고 기본적인 방식이라고함
    캠프 단계에선 이것만 써도 무방하다

  2. 두 번째 방식에서는 nullable한 _binding 변수를 사용하여 FragmentSecondBinding 객체를 초기화하고,
    non-null한 binding 속성을 통해 바인딩 객체에 접근
    이 방식은 onDestroyView에서 _binding을 null로 설정하여 메모리 누수를 방지한다
    프래그먼트의 뷰가 파괴될 때 _binding을 null로 설정함으로써 바인딩 객체가 더 이상 메모리에 남아있지 않도록 함.
    앱의 위젯이 많고 복잡해지면 쓰게 되는 방식
    메모리활용에 효율적이지만 캠프수준에선 위에 방식과 크게 차이는 나지 않는다고한다
    캠프 단계에선 위에것만 써도 무방함

프래그먼트 뷰가 파괴될때

  • 다른 프래그먼트로 이동할 때: 프래그먼트를 교체하거나 스택에서 제거할 때, 현재 프래그먼트의 뷰는 파괴
  • 액티비티가 닫힐 때: 액티비티가 종료되면 그 안에 포함된 모든 프래그먼트의 뷰도 파괴
  • 백스택에서 복구될 때: 프래그먼트를 백스택에 추가하고 나서 사용자가 뒤로 가기 버튼을 눌러 이전 상태로 돌아갈 때, 프래그먼트의 뷰는 파괴되고 다시 생성.
  • 구성 변경 시: 사용자가 디바이스를 회전하거나 키보드를 표시/숨기는 등의 작업을 수행하여 액티비티가 재생성되면, 그 안에 포함된 모든 프래그먼트의 뷰도 파괴되고 다시 생성

메인 페이지에서 의문

private fun setFragment(frag: Fragment) {
        supportFragmentManager.commit {
            replace(R.id.frameLayout, frag) // 프레임 레이아웃에 프래그먼트 뿌리겠다
            setReorderingAllowed(true)
            addToBackStack("")
        }
    }

여기서 setReorderingAllowed랑
addToBackStack은 뭘까?

setReorderingAllowed

트랜잭션의 실행순서를 시스템이 재정렬 할 수 있게 해줌
기본적으로 트랜잭션은 순차적으로 처리되는대 좀더 효율적으로 실행되게함
순서를 바꾸는거기때문에 서로 의존성이 있는 트랜잭션에선 주의 필요 예)프래그먼트 A를 제거하고 그 자리에 프래그먼트 B를 추가하는 트랜잭션 등

addToBackStack("")

사용자가 뒤로가기 버튼을 눌렀을때 이전 프래그먼트로 돌아가게 해줌

이걸 비활성화 시켜봤는대 액티비티 기준으로 뒤로 돌아가게 됬다

Notification 주의 할점
사용 하기전에 애플리케이션 알람 설정 on 해놔야함

0개의 댓글