【问题标题】:MVVM with RxJava without DataBinding带有 RxJava 的 MVVM 没有 DataBinding
【发布时间】:2019-06-19 08:54:21
【问题描述】:

看了很多关于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");

}

【问题讨论】:

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


    【解决方案1】:

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

    视图模型:

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

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

    【讨论】:

    • 谢谢,这正是我所缺少的
    猜你喜欢
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2017-04-20
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    相关资源
    最近更新 更多