带有 RxJava 的 MVVM,没有数据绑定

MVVM with RxJava without DataBinding

看了很多关于MVVM和RxJava的文章后,我需要实现一个最简单的demo,在不使用DataBinding的情况下很好地抓住思路

但我在 ViewModel 如何将数据列表通知 View (Activity) 时遇到了问题

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

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");

}

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

视图模型:

public class ViewModel {

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

Activity:

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()));
}

上面的示例没有存储订阅,以便为您提供一个简化的答案,但在实际操作中,请确保像您在示例中所做的那样清除订阅。