[Android/Java] Jetpack LiveData (Jetpack ViewModel MVVM+Repository 패턴)

Android Studio 4.1.3(windows판)에서의 흐름이 됩니다

여기에서는 MutableLiveData를 Repository로 가지고 단순한 데이터의 Model을 다루는 것만으로
간단한 구성으로 일련의 흐름을 설명합니다.

다음 기사의 프로젝트 기반에 대한 설명입니다.

Android Developer의 Jetpack LiveData/MVVM+Repository 패턴에 대한 설명은 다음과 같습니다.

Layout 준비



여기에서는 ViewBinding을 사용하여 구현합니다.
ViewBinding을 설정하는 방법을 알고 싶다면 아래를 참조하십시오.

MainFragment 템플릿의 TextView는 id가 지정되지 않았기 때문에
여기서 textView를 지정합니다.



데이터 모델 만들기



여기에서는 단순한 String Name만을 가지는 UserModel을 준비합니다.

UserModel.java
public class UserModel {
    public String Name;
}

리포지토리 만들기



여기에서는 UserModel을 다루는 MutableLiveData와 그 getter와 Name을 설정하는 메소드를 준비합니다.
※ 데이터를 갱신하기 위해 MutableLiveData를 사용합니다.
setValue()/postValue()의 차이를 자세히 알고 싶은 분은 다른 분의 기사에서 몇 가지 설명이 있으므로 찾아보세요

MainRepository.java
public class MainRepository{
    final MutableLiveData<UserModel> user = new MutableLiveData<>();
    public MutableLiveData<UserModel> getUser() {
        return user;
    }

    public void setName(String name) {
        UserModel userModel = user.getValue();
        if (userModel == null) {
            Log.d("MainRepository", "user = null");
            userModel = new UserModel();
        }
        userModel.Name = name;
        // setValue()はメインスレッドから呼び出す必要があります
        //user.setValue(userModel);
        user.postValue(userModel);
    }
}

ViewModel 구현



Repository 인스턴스 생성
Repository 메서드를 호출하는 메서드를 제공합니다.

MainViewModel.java
public class MainViewModel extends ViewModel {
    // TODO: Implement the ViewModel
    final MainRepository repository = new MainRepository();

    public MutableLiveData<UserModel> getUser() {
        return repository.getUser();
    }

    public void setName(String name) {
        repository.setName(name);
    }
}

Fragment 구현



Fragment를 새로 만들 때 자동으로 생성된 코드에 ViewModel 처리를 추가합니다.
Name에 값을 설정하면 observe의 onChanged()가 호출되고 TextView의 내용이 다시 작성됩니다.

MainFragment.java
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mViewModel = new ViewModelProvider(this).get(MainViewModel.class);
    // setを実行するとobserveのonChanged()が呼び出されます
    mViewModel.setName("test");

    mViewModel.getUser().observe(getViewLifecycleOwner(), new Observer<UserModel>() {
        @Override
        public void onChanged(UserModel user) {
            Log.d("MainFragment", user.Name);
            binding.textView.setText(user.Name);

            // getValue()で値の取得もできます
            Log.d("MainFragment", "getValue: " + mViewModel.getUser().getValue().Name);
        }
    });
}

좋은 웹페이지 즐겨찾기