带有不带数据绑定的RxJava的MVVM

时间:2019-01-25 13:52:42

标签: android mvvm rx-java rx-java2 android-mvvm

在阅读了很多有关MVVM和RxJava的文章之后,我需要实现最简单的演示以在不使用DataBinding的情况下很好地理解这个想法

但是我对ViewModel如何使用数据列表通知View(活动)的方式陷入了困境

我的ViewModel包含fetchGitHub(),它以这种方式使用RxJava

io.reactivex.Observable<List<Repo>> reposReturnedObservable = githubClient.reposForUser(user);

    reposReturnedObservable
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<List<Repo>>() {
                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onComplete() {

                }

                @Override
                public void onSubscribe(Disposable d) {
                    compositeDisposable.add(d);
                }

                @Override
                public void onNext(List<Repo> repos) {
                    data = repos;
                }
            });

此处缺少哪些行以使用数据更新视图

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    viewModel = new ViewModel();
    viewModel.fetchGitHub("square");

}

2 个答案:

答案 0 :(得分:1)

fetchGitHub()应该返回一个Observable,以便Activity可以订阅它。

ViewModel:

public class ViewModel {

    public Observable<List<Repo>> fetchGitHub(String userName) {
        return githubClient.reposForUser(user);
    }
}

活动:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView listSizeTextView = findViewById(R.id.listSizeTextView);

    viewModel = new ViewModel();
    viewModel.fetchGitHub("square")
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(list -> listSizeTextView.setText("list size: " + list.size()));
}

以上示例未存储订阅以为您提供简化的答案,但在实际操作中,请确保像示例中一样清除订阅。

答案 1 :(得分:0)

  

此处缺少哪些行以使用数据更新视图

您可以使用Rx,在您的Activity中公开可观察对象并进行订阅,也可以公开LiveData对象,在其上发布或使用一种奇特的{他们得到的{1}}方法。无论哪种情况,您的Transformations都必须订阅并更新用户界面