gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:22:14 25 4
gpt4 key购买 nike

我正在研究如何使用 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 接口(interface)定义如下:

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

存储库只是

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

而且它工作正常。问题如下:我的 Intent 是只在本地没有数据的情况下,在db中获取网络数据。

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

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

是否正确?还是应该以不同的方式完成?

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

提前致谢!

最佳答案

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

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

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

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

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

关于Android MVP - RxJava 和改造 - 最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46054520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com