Android 对于列表<;A>;包含列表<;B>,如何更改B中的值并返回修改后的列表<;A>;使用RxJava2?
我试图在MVP模式中实现rxandroid, 这是我的用例: A.classAndroid 对于列表<;A>;包含列表<;B>,如何更改B中的值并返回修改后的列表<;A>;使用RxJava2?,android,rx-java2,dagger-2,rx-android,android-mvp,Android,Rx Java2,Dagger 2,Rx Android,Android Mvp,我试图在MVP模式中实现rxandroid, 这是我的用例: A.class List<B> b; List<B> getB(){ return b; } String dataTochange; void setDataToChange(String dataToChange){ this.dataToChange = dataToChange } 我想在更改B中的值后返回相同的可观察值(列表(A)) 这就是我
List<B> b;
List<B> getB(){
return b;
}
String dataTochange;
void setDataToChange(String dataToChange){
this.dataToChange = dataToChange
}
我想在更改B中的值后返回相同的可观察值(列表(A))
这就是我所做的
REMOTEDATASOURCE.java:
Observable<List<A>> getAList(){
return FromApiService
.getAList() // returns List<A>
.flatMapIterable(List<A> -> A )
.map(A::getB)
.flatMapIterable(List<B> b -> b)
.map(b -> doSomeDownloading(b))
//After this i want to return the modified
List<A> containing list of B with dataChanged.
}
doSomeDownloading(B b){
somValue = doAsynchronousDownload(b)
b.setDataToChange(somValue);
}
doAsynchronousDownload(B b){
contains callbacks to listeners implemented by View for progress etc;
}
可观测a)
.flatMap(A->
可观察的。从可观察的(a.getB())
.doOnNext(b->doSomeDownloading(b))
托利斯先生()
.TooObservable()文件
.map(新函数(){
@凌驾
公共A应用程序(列表b)引发异常
{
a、 挫折(b);
返回a;
}
})
)
托利斯先生()
.TooObservable()文件
.doOnSubscribe(…)
执行上述操作显示,doSomeDownloading()的结果将被忽略。。这实际上取决于如何将A转换为列表以及如何处理它。 如果您的转换很简单(意味着它们不是耗费时间/资源的过程)。您可以使用平面图“缓存”您的值 例:
FromApiService.getAList()
.flatMapIterable(列表->A)
.flatMap{a:a->
可观察的。从可观察的(a.getB())
.doOnNext{b->doSomeDownloading(b)}//或Map/FlatMap(如果需要)
托利斯先生()
.toObservable()//这是您的新列表
.map{b->a.setB(b)}//这是你的a
}
。您好。。。doSomeDownloading很耗时,因为文件需要异步下载。。!!在该列表需要转换并添加到…@rdk1234之后,doSomeThingLoading做什么并不重要。如果getB()不耗时,可以使用此代码。嗨..最后一行映射{b->a.setB(b)}抱怨返回类型不正确:void无法转换为object@rdk1234。是的,我忘了。将新的B绑定到A之后,您应该返回A。我已经写了以下内容.map(新函数(列表b,A)@覆盖A应用(列表b){A.setB(b);返回A;})).toList.toObservable()
…执行上述操作将显示忽略doSomeDownloading(b)!!忽略doSomeDownloading()的结果是什么意思?如果您的doSomeDownloading()只是一个下载工作,而没有更改任何B值,那么上面的代码应该可以工作。但是如果你想doSomeDownloading()然后返回一个新的B。那么你应该使用一个map
而不是doOnNext
@PhoenixWang…我的错。!!。。我在doSomeDownloading方法中遇到了一些糟糕的逻辑问题。现在它可以正常工作了。非常感谢您的帮助@PhoenixWang..嗨..在上述情况下,如果我的doSomeDownloding恰好是一个递归异步函数,例如:doSomeDownloding(List)**。。。在所有请求完成后,我将列表传递给**订阅的(onNext),这可能吗!!在RxJava中,这是绝对可能的,而且代码可能要短得多。您不需要那些toList()
和flatMapIterable()
。您只保留了flatMap
@PhoenixWang…我发现很难实现它。。你能帮我聊天吗。。。问题是在请求完成之前,subscribe onNext被调用。。。!!如果你能分享一些样品,那将非常有帮助!
serviceApi.getAList()
.flatMapIterable(List<A> -> a)
.flatMap(A a ->
Observable.fromIterable(a.getB())
.doOnNext(b ->doSomeDownloading(b))
.toList()
.toObservable()
.map(new Function<List<B>, A>() {
@Override
public A apply(List<B> b) throws Exception
{
a.setB(b);
return a;
}
})
)
.toList()
.toObservable()
.doOnSubscribe(...)
FromApiService.getAList()
.flatMapIterable(List<A> -> A)
.flatMap{a:A ->
Observable.fromIterable(a.getB())
.doOnNext{b -> doSomeDownloading(b)}//or Map/FlatMap if you want
.toList()
.toObservable()//here you have your new list<B>
.map{b -> a.setB(b)}//here you get your A
}