1

我正在研究如何使用 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");
        }
    });
}

Retrofit 接口定义如下:

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

存储库只是

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

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

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

我的猜测是 Presenter 是正确的地方,因为它创建了一个线程,因此存储库可以按顺序执行它的工作(获取 db,如果没有,然后获取网络/缓存;在获取数据的任何地方返回数据),并且当提供数据时,在 Consumer 的 accept 方法中通知视图。

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

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

提前致谢!

4

1 回答 1

1

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

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

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

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

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

于 2017-09-07T07:22:35.757 回答