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 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.