Android MVP-RxJava和改造-最佳方法
我正在研究如何使用MVP、RxJava2和改型来开发Android应用程序 在我的演示者中,以下是代码: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>>
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操作,以尝试最初从数据库获取数据。谢谢