[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を指定します

データのModelを作成

ここでは単純なString Nameだけを持つUserModelを用意します

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

Repositoryを作成

ここでは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);
        }
    });
}