1. ホーム
  2. android

[解決済み] バックグラウンドサービスからViewModelのLiveDataを更新し、UIを更新する方法

2022-10-26 15:16:44

質問

最近、googleが発表したAndroid Architectureについて調べています。以下のサイトより ドキュメンテーション こんなのがありました。

public class MyViewModel extends ViewModel {
    private MutableLiveData<List<User>> users;
    public LiveData<List<User>> getUsers() {
        if (users == null) {
            users = new MutableLiveData<List<Users>>();
            loadUsers();
        }
        return users;
    }

    private void loadUsers() {
        // do async operation to fetch users
    }
}

の場合、アクティビティはこのリストに以下のようにアクセスすることができます。

public class MyActivity extends AppCompatActivity {
    public void onCreate(Bundle savedInstanceState) {
        MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
        model.getUsers().observe(this, users -> {
            // update UI
        });
    }
}

私の質問は、これを行うつもりです。

  1. の中に loadUsers() 関数で、私はデータを非同期に取得し、最初にそのデータのデータベース(部屋)をチェックします。

  2. もしそこでデータが得られない場合、私はウェブサーバーからデータを取得するためにAPIコールを行います。

  3. 取得したデータをデータベース(Room)に挿入し、そのデータに応じてUIを更新します。

これを行うには、どのようなアプローチが推奨されますか?

もし私が Service から API を呼び出すために loadUsers() メソッドから API を呼び出す場合、どのようにすれば MutableLiveData<List<User>> users 変数から Service ?

どのように解決するのですか?

私はあなたが使用していることを仮定しています アンドロイド・アーキテクチャ・コンポーネント . 実際には、どこで service, asynctask or handler を呼び出してデータを更新する場所には関係ありません。サービスから、あるいは非同期タスクから、データを挿入することができます。 postValue(..) メソッドを使って挿入できます。あなたのクラスはこのようになります。

private void loadUsers() {
    // do async operation to fetch users and use postValue() method
    users.postValue(listOfData)
}

のように usersLiveData , Room データベースは、挿入された場所にユーザーのデータを提供する責任があります。

Note: MVVMのようなアーキテクチャでは、リポジトリは主にローカルデータとリモートデータのチェックとプルに対して責任を持ちます。