Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 对于列表<;A>;包含列表<;B>,如何更改B中的值并返回修改后的列表<;A>;使用RxJava2?_Android_Rx Java2_Dagger 2_Rx Android_Android Mvp - Fatal编程技术网

Android 对于列表<;A>;包含列表<;B>,如何更改B中的值并返回修改后的列表<;A>;使用RxJava2?

Android 对于列表<;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)) 这就是我

我试图在MVP模式中实现rxandroid, 这是我的用例:

A.class

   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
               }