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를 사용해야합니다.
필자의 요점은 단편의 수와 이들이 유사한 지 여부가 항상 고려해야 할 주요 측면은 아니라는 것입니다. 조각이 동적인지 여부도 중요합니다.
다음은 ViewPager
4 개의 조각이있는 각 조각의 로그 수명주기입니다.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
될 때 호출 합니다 .offscreenPageLimit
FragmentPagerAdapter
참고 : 나는 우리가 사용한다고 생각 FragmentStatePagerAdapter
A에 대한 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 |