Android MVP - RxJava和改造 - 最好的方法

时间:2017-09-05 12:02:38

标签: android mockito retrofit2 rx-java2 android-mvp

我正在研究如何使用MVP,RxJava2和改造开发Android应用程序。

在我的演示者中,这是代码:

public void loadData() {

    compositeDisposable.dataModelRepository.getDataList().subscribeOn(Schedulers.io())
            .observeOn(mainScheduler).subscribe(new Consumer<List<Data>>() {
        @Override
        public void accept(List<Data> dataList) throws Exception {
            if (!dataList.isEmpty())
                view.displayData(dataList);
            else
                view.displayEmpty();
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {
            System.out.println(throwable.toString());
            view.displayError("boooom");
        }
    });
}

改造界面已按以下方式定义:

@GET("/fooURL")
Single<List<Data>> getDataList();

存储库只是

public Single<List<Data>> getDataList() {
    return retrofitApi.getDataList();
}

它工作正常。问题如下:我的意图是仅在数据在本地不可用时才获取网络数据,在db。

考虑到这一点,在演示者中管理调度程序是否正确?或者它们应该在存储库中管理吗?

我的猜测是,演示者是正确的位置,因为它创建了一个线程,因此存储库可以按顺序执行其操作(获取数据库,如果没有,则获取网络/缓存;在获取数据的任何地方返回数据),以及何时数据提供,通知消费者接受方法内的视图。

这是对的吗?或者应该以不同的方式完成?

另一点是:我如何使用Mockito测试存储库? dataModelRepository.getDataList()方法我的意思是?不确定如何为单个对象做任何断言...

提前致谢!

1 个答案:

答案 0 :(得分:1)

我建议您卸载与获取相关的所有业务逻辑,将数据检索到中央存储库。

实现与您所描述的有些类似的一种方法是使用concat运算符。

Observable<List<Data>> getData() {
    return Observable
        .concat(localRepository.getData(), remoteRepository.getData())
        .first();
}

这将首先尝试从本地存储库获取数据,如果没有数据,它将发出网络请求。

我假设您的本地和远程存储库将在新线程上观察,但如果您需要在UI上执行任何操作,只需订阅演示者中的主线程。