我正在研究如何使用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()方法我的意思是?不确定如何为单个对象做任何断言...
提前致谢!
答案 0 :(得分:1)
我建议您卸载与获取相关的所有业务逻辑,将数据检索到中央存储库。
实现与您所描述的有些类似的一种方法是使用concat运算符。
Observable<List<Data>> getData() {
return Observable
.concat(localRepository.getData(), remoteRepository.getData())
.first();
}
这将首先尝试从本地存储库获取数据,如果没有数据,它将发出网络请求。
我假设您的本地和远程存储库将在新线程上观察,但如果您需要在UI上执行任何操作,只需订阅演示者中的主线程。