Programming

FragmentPagerAdapter와 FragmentStatePagerAdapter의 차이점은 무엇입니까?

procodes 2020. 3. 1. 16:01
반응형

FragmentPagerAdapter와 FragmentStatePagerAdapter의 차이점은 무엇입니까?


차이점은 무엇이며 FragmentPagerAdapter그리고 FragmentStatePagerAdapter?

소개 FragmentPagerAdapter구글의 가이드는 말한다 :

이 버전의 호출기는 일련의 탭과 같이 일반적으로 더 많은 정적 조각이 페이징 될 때 사용하기에 가장 좋습니다. 사용자가 방문하는 각 페이지의 조각은 메모리에 유지되지만보기 계층 구조는 보이지 않을 때 파괴 될 수 있습니다. 프래그먼트 인스턴스가 임의의 상태를 유지할 수 있기 때문에 상당한 양의 메모리를 사용할 수 있습니다. 더 큰 페이지 세트의 경우을 고려하십시오 FragmentStatePagerAdapter.

그리고 약 FragmentStatePagerAdapter:

이 버전의 호출기는 목록보기처럼 작동하는 많은 페이지가있을 때 더 유용합니다. 사용자에게 페이지가 표시되지 않으면 전체 조각이 삭제되어 해당 조각의 저장된 상태 만 유지됩니다. 따라서 페이저는 페이지 FragmentPagerAdapter간에 전환 할 때 잠재적으로 더 많은 오버 헤드가 발생하는 것과 비교하여 방문한 각 페이지와 관련된 메모리를 훨씬 적게 유지할 수 있습니다 .

그래서 나는 단지 3 개의 조각이 있습니다. 그러나 모두 대량의 데이터가있는 별도의 모듈입니다.

Fragment1(사용자 입력)를 일부 데이터로 처리하고, 활동을 통해 전달 Fragment2단순한 인 ListFragment. Fragment3또한입니다 ListFragment.

그래서 내 질문은 : 어떤 어댑터를 사용해야합니까? FragmentPagerAdapter또는 FragmentStatePagerAdapter?


문서가 말했듯이, 이런 식으로 생각하십시오. 책 리더와 같은 응용 프로그램을 수행하는 경우 모든 조각을 한 번에 메모리에로드하지 않을 것입니다. Fragments사용자가 읽을 때로드하고 파괴하려고 합니다. 이 경우을 사용 FragmentStatePagerAdapter합니다. 그냥 무거운 데이터 (등의 많은 포함하지 않는 3 "탭"을 표시하는 경우 Bitmaps), 다음 FragmentPagerAdapter잘 맞게 수 있습니다. 또한 ViewPager기본적으로 3 개의 프래그먼트를 메모리에로드합니다. 첫 번째로 Adapter언급 한 View계층 구조는 필요할 때 다시로드하고 다시로드 할 수 있으며 두 번째 Adapter는 상태를 저장 Fragment하고 완전히 파괴합니다. 사용자가 해당 페이지로 돌아 오면 상태가 검색됩니다.


  • FragmentPagerAdapter전체 조각을 메모리에 저장하고에서 많은 양의 조각을 사용하면 메모리 오버 헤드가 증가 할 수 ViewPager있습니다.

  • 그와는 반대로 형제 FragmentStatePagerAdapter의 savedInstanceState 만 저장하고 포커스를 잃으면 모든 조각을 삭제합니다.

  • 따라서 FragmentStatePagerAdapter데이터가에 저장 될 수 있기 때문에 위젯이있는 조각과 같은 동적 조각을 사용해야 할 때 사용해야합니다 savedInstanceState.

  • 반대로 FragmentPagerAdapter전체 조각을 메모리에 저장해야 할 때 형제를 사용해야합니다.

  • 전체 조각이 메모리에 유지된다고 말하면 인스턴스가 파괴되지 않고 메모리 오버 헤드가 생성됩니다. 따라서에 FragmentPagerAdapter대한 조각 수가 적은 경우에만 사용하는 것이 좋습니다 ViewPager.

  • 프래그먼트가 정적 인 경우 인스턴스가 저장되는 많은 양의 객체가 없기 때문에 훨씬 좋습니다.

더 자세하게

FragmentStatePagerAdapter :

  • 를 사용 FragmentStatePagerAdapter하면 불필요한 조각이 파괴됩니다. 트랜잭션은 활동에서 조각을 완전히 제거하기 위해 노력합니다 FragmentManager.

  • 의 상태는 FragmentStatePagerAdapter그것이 당신의 조각의 밖으로 절약 할 수 있다는 사실에서 유래 Bundle에서을 savedInstanceState은 사용자를 탐색 다시 destroyed.When 때 새로운 조각은 조각의 상태를 사용하여 복원 할 것입니다.

FragmentPagerAdapter :

  • 비교 FragmentPagerAdapter에 의해 종류의 아무것도하지 않습니다. 조각이 더 이상 필요하지 않을 때. 대신 거래를 FragmentPagerAdapter호출 detach(Fragment)합니다 remove(Fragment).

  • 이것은 살아의에게 조각의보기 만 잎 조각의 인스턴스를 파괴 FragmentManager에서 만든 조각 .SO FragmentPagerAdapter파괴되지 않습니다.


@Naruto가 암시하더라도 문서 나이 페이지의 답변에서 명시 적으로 언급 FragmentPagerAdapter되지 않은 부분은 Fragment를 메모리에 유지하기 때문에 Fragment의 데이터가 변경되면 Fragments를 업데이트하지 않습니다.

따라서 표시 할 프래그먼트 수가 제한되어 있어도 프래그먼트를 새로 고치려면 (예 : 프래그먼트에서 listView를 업데이트하기 위해 쿼리를 다시 실행하는 경우) FragmentStatePagerAdapter를 사용해야합니다.

필자의 요점은 단편의 수와 이들이 유사한 지 여부가 항상 고려해야 할 주요 측면은 아니라는 것입니다. 조각이 동적인지 여부도 중요합니다.


다음은 ViewPager4 개의 조각이있는 각 조각의 로그 수명주기입니다.offscreenPageLimit = 1 (default value)

FragmentStatePagerAdapter

Fragment1 (시작 활동)으로 이동

Fragment1: onCreateView
Fragment1: onStart
Fragment2: onCreateView
Fragment2: onStart

조각 2로 이동

Fragment3: onCreateView
Fragment3: onStart

조각 3으로 이동

Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach
Fragment4: onCreateView
Fragment4: onStart

조각 4로 이동

Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy

FragmentPagerAdapter

Fragment1 (시작 활동)으로 이동

Fragment1: onCreateView
Fragment1: onStart
Fragment2: onCreateView
Fragment2: onStart

조각 2로 이동

Fragment3: onCreateView
Fragment3: onStart

조각 3으로 이동

Fragment1: onStop
Fragment1: onDestroyView
Fragment4: onCreateView
Fragment4: onStart

조각 4로 이동

Fragment2: onStop
Fragment2: onDestroyView

결론 : 파편이 극복 되지 않은 상태 에서 FragmentStatePagerAdapter호출 onDestroy될 때 호출 합니다 .offscreenPageLimitFragmentPagerAdapter

참고 : 나는 우리가 사용한다고 생각 FragmentStatePagerAdapterA에 대한 ViewPager있기 때문에 좋은 성능을위한 것입니다 페이지를 많이 가지고있다.

offscreenPageLimit:

우리가 Fragment3에 가면, 그것은 것입니다 (있는 경우 또는 Fragment5) Fragment1을 detroy 때문에 offscreenPageLimit = 1. 우리가 설정 offscreenPageLimit > 1하면 파괴 되지 않습니다 .
이 예에서 우리가 설정 한 경우 offscreenPageLimit=4, 사용하는 사이에 다른이 없다 FragmentStatePagerAdapter거나 FragmentPagerAdapter조각이 호출하지 않기 때문에 onDestroyView그리고 onDestroy우리는 탭을 변경하는 경우는

여기 Github 데모


FragmentPagerAdapter어댑터에서 페치 된 이전 데이터를 저장하고 FragmentStatePagerAdapter실행될 때마다 어댑터에서 새 값을 가져옵니다 .


FragmentStatePagerAdapter = ViewPager에 많은 조각을 수용합니다. 이 어댑터는 프래그먼트가 사용자에게 보이지 않고 프래그먼트의 savedInstanceState 만 계속 사용하기 위해 프래그먼트를 삭제합니다. 이런 식으로 동적 조각의 경우 적은 양의 메모리가 사용되고 더 나은 성능이 제공됩니다.

참고 URL : https://stackoverflow.com/questions/18747975/what-is-the-difference-between-fragmentpageradapter-and-fragmentstatepageradapte



반응형