Android 최적화 프로젝트 의 Fragment 게 으 른 로드 실현 코드

배경
안 드 로 이 드 애플 리 케 이 션 에서 ViewPager 는 우리 가 사용 할 수 없 는 컨트롤 입 니 다.공간 을 적 게 차지 하 는 동시에 콘 텐 츠 의 다양성 을 강화 하 는 동시에 그 내부 에 구 글 의 혈액 이 흐 르 기 때문에 거의 모든 App 에 표 시 된 컨트롤 이 됩 니 다.그러나 ViewPager 의 모든 Fragment 가 네트워크 를 통 해 데 이 터 를 끌 어 와 불 러 와 야 한다 면 ViewPager 는 기본적으로 앞의 두 항목 을 불 러 오기 때문에 네트워크 패 킷 을 잃 어 버 리 거나 네트워크 가 막 히 는 등 문제 가 발생 하기 쉬 우 므 로 Fragment 는 게 으 른 로 딩 을 사용 하 는 것 이 필요 합 니 다.
밤 을 들다
image
위의 그림 에서 보 듯 이 우 리 는 두 개의 큰 Tab:인물 과 풍경 이 있다.그리고 인물 Tab 아래 에 세 개의 Tab 이 있 습 니 다.미녀,잘 생 긴 남자,몽 바 세 개의 Tab 이 있 고 풍경 Tab 아래 에 베 이 징,홍콩,상하 이 세 개의 Tab 이 있 습 니 다.앱 이 시작 되 었 을 때 실행 되 는 수명 주 기 는 다음 과 같 습 니 다.
image
우 리 는 App 이 미녀 와 잘 생 긴 남자 두 개의 Fragment 를 기본적으로 불 러 오고 그들의 생명 주 기 는 모두 onStar()방법 으로 실 행 됩 니 다.그리고 두 개의 Fragment 를 불 러 옵 니 다.만약 에 우리 가 Fragment 를 불 러 올 때 네트워크 데 이 터 를 끌 어 올 리 면 위 에서 말 한 네트워크 분실 이나 네트워크 막힘 등 문 제 를 초래 할 수 있 습 니 다.그래서 우 리 는 이 문 제 를 피하 기 위해 서 입 니 다.Fragment 의 게 으 른 로 딩 을 실현 해 야 합 니 다.Fragment 를 볼 수 있 을 때 네트워크 로 데 이 터 를 불 러 옵 니 다.
2.Fragment 게 으 름 로드 실현
배경 토론 의 문제 에 대해 우리 가 최종 적 으로 실현 해 야 할 목 표 는 Fragment 가 우리 에 게 보 였 을 때 우 리 는 네트워크 로 딩 을 한 다음 에 데 이 터 를 분석 하고 UI 를 업데이트 하 는 것 이다.위의 데모 에 대하 여 우 리 는 다음 과 같은 효 과 를 해 야 한다.
image
실현 하려 면 복잡 하지 않 습 니 다.Fragment 에setUserVisibleHint라 는 방법 이 있 습 니 다.그리고 이 방법 은 onCreate()방법 보다 좋 기 때문에 Fragment 의 생명 주기 로 볼 수 있 습 니 다.이것 은 isVisibleToUser 를 통 해 현재 Fragment 를 볼 수 있 는 지,볼 수 있 을 때 네트워크 로 딩 을 할 수 있 는 지 알려 줍 니 다.

public void setUserVisibleHint(boolean isVisibleToUser)
우리 가setUserVisibleHint방법 에서 Log 출력 을 할 때 다음 을 볼 수 있 습 니 다.
image
볼 수 있 을 때 만,우리 isVisibleToUser 는 true 이 고,그렇지 않 으 면 false 입 니 다.그래서 우 리 는setUserVisibleHint방법 을 다시 쓴 다음 에 볼 수 있 을 때 네트워크 로 데 이 터 를 불 러 올 수 있 습 니 다.

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
  Log.d("TAG", mTagName + " setUserVisibleHint() --> isVisibleToUser = " + isVisibleToUser);

  if (isVisibleToUser) {
    pullData();
  }
  super.setUserVisibleHint(isVisibleToUser);
}
3.실제 용도 에 따라 게 으 름 로드 사용
두 번 째 부분 에서 알 수 있 듯 이setUserVisibleHint(boolean isVisibleToUser)방법 은onCreate보다 일찍 호출 되 었 습 니 다.그러나 우 리 는 보통 데 이 터 를 불 러 올 때 데이터 불 러 올 때 UI 업 데 이 트 를 하기 때문에 문제 가 생 겼 습 니 다.데 이 터 를 끌 어 올 리 는 것 이 초 회 이지 만 UI 바 인 딩 이나 Adapter 초기 화 등 을 하지 않 았 다 면 UI 를 업데이트 할 수 없습니다.그래서 Fragment 는 우리 에 게 또 다른 방법getUserVisibleHint()을 제공 했다.이것 은 현재 Fragment 가 보 이 는 지 여 부 를 판단 하 는 데 사용 되 기 때문에 우 리 는 일련의 변수 가 초기 화 된 후에 보 이 는 지 여 부 를 판단 할 수 있다.만약 에 보면 데이터 추출 을 할 수 있다.

@Override
public void onStart() {
  super.onStart();
  Log.d("TAG", mTagName + " onStart()");
  ...
  if(getUserVisibleHint()) {
    pullData();
  }
}
물론 인터넷 요청 이 UI 업데이트 와 관련 이 없다 면setUserVisibleHint(boolean isVisibleToUser)에서 직접 조작 할 수 있 기 때문에 최종 적 으로 각자 의 실제 용도 에 따라 사용 해 야 한다.
마지막 으로 게 으 른 데 모 를 첨부 합 니 다:Github/LazyFragment
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기