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개의 댓글

관련 채용 정보