Android MVP-RxJava和改造-最佳方法

Android MVP-RxJava和改造-最佳方法,android,mockito,retrofit2,rx-java2,android-mvp,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>>

我正在研究如何使用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");
        }
    });
}
public void loadData(){
compositeDisposable.dataModelRepository.getDataList().subscribeOn(Schedulers.io())
.observeOn(mainScheduler).subscribe(新使用者(){
@凌驾
public void accept(List dataList)引发异常{
如果(!dataList.isEmpty())
查看.显示数据(数据列表);
其他的
view.displayEmpty();
}
},新消费者(){
@凌驾
public void accept(Throwable Throwable)引发异常{
System.out.println(throwable.toString());
view.displayError(“boooom”);
}
});
}
改造接口的定义如下:

@GET("/fooURL")
Single<List<Data>> getDataList();
@GET(“/fooURL”)
单个getDataList();
而存储库只是

public Single<List<Data>> getDataList() {
    return retrofitApi.getDataList();
}
publicssinglegetdatalist(){
返回api.getDataList();
}
它工作得很好。问题如下:我的目的是仅在数据在本地不可用时获取网络数据(以db为单位)

记住这一点,在presenter中管理调度程序是否正确?还是应该在存储库中管理它们

我的猜测是presenter是正确的位置,因为它创建了一个线程,这样存储库就可以按顺序完成它的工作(如果没有,则获取数据库,然后获取网络/缓存;在获取数据的任何位置返回数据),并且在提供数据时,通知使用者的accept方法中的视图

对吗?还是应该用另一种方式

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


提前谢谢

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

实现与您描述的类似的一种方法是使用concat操作符

Observable<List<Data>> getData() {
    return Observable
        .concat(localRepository.getData(), remoteRepository.getData())
        .first();
}
Observable getData(){
可观测回波
.concat(localRepository.getData(),remoteRepository.getData())
.first();
}
这将首先尝试从本地存储库获取数据,如果没有数据,则会发出网络请求


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

查看concat。这可以用来消耗第一个可观察到的(本地),如果它不发出任何项目,则消耗第二个(网络),MVP中没有正确的方法。人们做任何适合他们的事。都是意见based@EmanuelSeibold谢谢你的提示@我同意你的看法,我只是想看到不同的观点。正如您所看到的,这种方法可能在单元测试中存在问题,因为我不确定如何验证存储库。。。也许有人会提出一些不同的建议,以更好的方式进行。不幸的是,这里不是征求不同观点的地方。基于意见的问题在这里是离题的谢谢你的建议,事实上,我已经创建了一个repository类,也就是说,目前,它充当代理(它接收getData请求,并将请求发送到网络)。下一步是创建concat操作,以尝试最初从数据库获取数据。谢谢