Android Jetpack 구조 구성 요소 ViewModel 상세 설명

머리말
앞의 두 편의 글 에서 우 리 는 Lifecycle 과 DataBind 를 배 웠 습 니 다.이 글 은 Jetpack 시리즈 에서 비교적 중요 한 ViewModel 을 배 웠 습 니 다.Jetpack 의 많은 구성 요소 들 이 조합 되 어 사용 되 기 때문에 단독 지식 점 은'무의미'할 수 있 지만 우리 프로젝트 실전 의 기초 입 니 다!
ViewModel 사용
ViewModel 류 는 라 이 프 사이클 을 중시 하 는 방식 으로 인터페이스 와 관련 된 데 이 터 를 저장 하고 관리 하 는 데 목적 을 둔다.ViewModel 클래스 는 화면 회전 등 설정 이 변 경 된 후에 도 데 이 터 를 계속 존재 하 게 합 니 다.이 말 은 이해 하기 쉽 습 니 다.우리 가 Lifecycle 을 설명 할 때 예 를 들 었 던 것 을 기억 하 십 니까?우 리 는 그 예 를 사용 합 니 다.만약 당신 이 아직 보지 못 했다 면 다음 과 같이 이동 할 수 있 습 니 다.
Android Jetpack 시리즈 Lifecycle
우 리 는 다시 한 번 수 요 를 돌 이 켜 보 았 다.
Activity 에서 볼 수 있 을 때,우 리 는 계수 기능 을 하 러 갑 니 다.1 초 마다 1 을 더 하고,Activity 가 보이 지 않 을 때 계 수 를 멈 추고,Activity 가 소 멸 될 때 계 수 를 0 으로 설정 합 니 다.여기 서 우 리 는 Activity 가 소 멸 될 때 count 를 0 으로 설정 하지 않 습 니 다.WorkUtil 코드 는 다음 과 같 습 니 다.

public class WorkUtil implements LifecycleObserver {
 
 
 private static final String TAG = "WorkUtil";
 
 private boolean whetherToCount = true;
 
 private int count = 0;
 
 @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
 public void start() {
 new Thread(new Runnable() {
  @Override
  public void run() {
  while (whetherToCount) {
   try {
   Thread.sleep(1000);
   count++;
   Log.d(TAG, "start: " + count);
   } catch (InterruptedException e) {
   e.printStackTrace();
   }
  }
  }
 }).start();
 }
 
 @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
 public void onStop() {
 whetherToCount = false;
 Log.d(TAG, "onStop: ");
 }
 
 @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
 public void onDestory() {
 }
}
계산 하 는 과정 에서 화면 을 회전 시 키 는 프로그램 을 실행 합 니 다.실행 결 과 는 다음 과 같 습 니 다.

화면 이 회전 할 때 수명 주기 가 바 뀌 어 데이터 가 소각 되 었 기 때문에 카운터 의 수 는 초기 값 부터 계산 되 었 습 니 다.그러면 우 리 는 이 문 제 를 어떻게 해결 하 는 지 볼 수 있 습 니 다.캐 시 야,onSabe InstanceState()를 다시 쓰 는 방법 등 은 모두 가능 하지만 우아 하지 않 습 니 다.그렇다면 어떻게 우아 하 게 이 문 제 를 해결 할 수 있 을 까?이것 이 바로 우리 의 오늘 의 주인공 이다.  ViewModel。
ViewModel 사용
우리 가 새로 만 든 Main3Activity Model 은 ViewModel 에서 계승 되 었 습 니 다.Main3Activity Model 에서 count 변 수 를 다음 과 같이 정의 합 니 다.

public class Main3ActivityViewModel extends ViewModel {
 
 public int count = 0;
 
}
맞 아,이렇게 간단 해.우 리 는 계수 의 변수 가 이 model 의 변수 라 는 것 을 보증 하면 우리 위의 문 제 를 해결 할 수 있어.
저 희 는 ViewModel Providers 를 통 해 ViewModel 대상 을 가 져 옵 니 다.
main3ActivityViewModel = ViewModelProviders.of(this).get(Main3ActivityViewModel.class);
그러나 이 방법 은 이미 시대 에 뒤떨어 졌 다.대체 방법 은?
main3ActivityViewModel = new ViewModelProvider(this).get(Main3ActivityViewModel.class);
WorkUtil 에서 Model 의 변 수 를 사용 할 수 있 도록 ViewModel 을 전달 하고 WorkUtil 에 구조 방법 을 추가 합 니 다.

private Main3ActivityViewModel main3ActivityViewModel;
 
public WorkUtil(Main3ActivityViewModel main3ActivityViewModel) {
 this.main3ActivityViewModel = main3ActivityViewModel;
}
WorkUtil 의 계수 변 수 를 main3ActivityView Model.count 로 바 꿉 니 다.다음 과 같 습 니 다.

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void start() {
 new Thread(new Runnable() {
 @Override
 public void run() {
  while (whetherToCount) {
  try {
   Thread.sleep(1000);
   main3ActivityViewModel.count++;
   Log.d(TAG, "start: " + main3ActivityViewModel.count);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  }
 }
 }).start();
}
main3Activity 에서 lifecycle 에서 전달:
getLifecycle().addObserver(new WorkUtil(main3ActivityViewModel));
프로그램 을 다시 실행 하고 실행 과정 에서 핸드폰 화면 을 회전 시 키 며 다음 과 같이 인쇄 합 니 다.

화면 이 회전 한 후에 계수기 의 계수 가 유지 되 었 습 니 다.그러면 viewModel 은 어떻게 했 습 니까?이것 은 ViewModel 대상 이 보기 나 LifecycleOwners 의 특정한 인 스 턴 스 보다 더 오래 존재 하기 때 문 입 니 다.ViewModel 의 생명 주 기 는 다음 그림 과 같 습 니 다(홈 페이지 참조). 
ViewModel 에 전달
현재 계수 의 수 요 는 0 부터 시간 을 계산 하 는 것 입 니 다.우 리 는 현재 수 요 를 다음 과 같이 수정 하고 사용자 가 입력 한 숫자 를 기점 으로 계산 합 니 다.그러면 ViewModel 의 count 는 0 이 아니 라 들 어 오 는 매개 변수 입 니 다.우 리 는 Main3Activity 에서 변수 input Count 를 정의 하여 사용자 가 입력 한 숫자 를 모 의 합 니 다.
private int inputCount = 100;
Main3ViewModel 에 구조 방법 추가

public int count = 0;
 
public Main3ActivityViewModel(int count) {
 this.count = count;
}
여기 서 보면 우리 가 new 를 직접 전달 하면 되 지 않 겠 습 니까?이것 은 절대 안 된다 는 것 을 기억 하 세 요.만약 에 우리 가 직접 실례 화 를 사용 하여 ViewModel 을 만 들 면 ViewModel 의 생명 주 기 는 Activity 의 영향 을 받 기 때문에 왜 우 리 는 ViewModel Provider 를 통 해 ViewModel 의 인 스 턴 스 를 얻 을 수 밖 에 없 습 니까?
저 희 는 ViewModelProvider.Factory 를 통 해 전 참 을 실현 해 야 합 니 다.Main3ActivityViewModelFactor 는 ViewModelProvider.Factory 에서 계승 하여 onCreate 방법 을 다시 작성 해 야 합 니 다.다음 과 같 습 니 다.

public class Main3ActivityViewModelFactory implements ViewModelProvider.Factory {
 
 @NonNull
 @Override
 public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
 return null;
 }
}
구조 방법 을 추가 하고 create 에 VideModel 인 스 턴 스 를 만 듭 니 다.

private int count;
 
public Main3ActivityViewModelFactory(int count) {
 this.count = count;
}
 
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
 return (T) new Main3ActivityViewModel(count);
}
Activity 에서 인 스 턴 스 를 가 져 올 때 다음 과 같은 방법 을 사용 합 니 다.
main3ActivityViewModel = new ViewModelProvider(this,new Main3ActivityViewModelFactory(inputCount)).get(Main3ActivityViewModel.class);
프로그램 을 실행 합 니 다.인쇄 결 과 는 다음 과 같 습 니 다. 
이렇게 해서 저희 가 뷰 모델 전달 파 라미 터 를 실현 하 게 되 었 습 니 다.
이상 은 안 드 로 이 드 Jetpack 구조 구성 요소 ViewModel 에 대한 상세 한 내용 입 니 다.안 드 로 이 드 Jetpack 구조 구성 요소 ViewModel 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기