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에서 만든 조각 .SOFragmentPagerAdapter파괴되지 않습니다.
@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우리는 탭을 변경하는 경우는
FragmentPagerAdapter어댑터에서 페치 된 이전 데이터를 저장하고 FragmentStatePagerAdapter실행될 때마다 어댑터에서 새 값을 가져옵니다 .
FragmentStatePagerAdapter = ViewPager에 많은 조각을 수용합니다. 이 어댑터는 프래그먼트가 사용자에게 보이지 않고 프래그먼트의 savedInstanceState 만 계속 사용하기 위해 프래그먼트를 삭제합니다. 이런 식으로 동적 조각의 경우 적은 양의 메모리가 사용되고 더 나은 성능이 제공됩니다.
'Programming' 카테고리의 다른 글
| Eclipse-행 번호 속성이 누락되어 중단 점을 설치할 수 없습니다. (0) | 2020.03.01 |
|---|---|
| JavaScript, Node.js : Array.forEach가 비동기식입니까? (0) | 2020.03.01 |
| SQL Server에서 행을 열로 효율적으로 변환 (0) | 2020.03.01 |
| Apache ZooKeeper 설명 (0) | 2020.02.29 |
| 메소드는 다른 유형의 메소드와 동일한 지우기를 갖습니다. (0) | 2020.02.29 |