Rxjava Android 如何使用 Zip 运算符

2022-08-31 16:05:42

我在理解RxJava中用于我的Android项目的zip运算符时遇到了很多麻烦。问题 我需要能够发送网络请求来上传视频 然后我需要发送网络请求上传图片以配合它 最后我需要添加描述并使用前两个请求的响应将视频和图片的位置URL以及描述上传到我的服务器。

我以为zip运算符非常适合这个任务,因为我明白我们可以接受两个可观察量(视频和图片请求)的响应,并将它们用于我的最终任务。但我似乎无法按照我的设想让它发生。

我正在寻找一个人来回答如何用一些伪代码在概念上做到这一点。谢谢


答案 1

Zip 运算符严格配对从可观察量发出的项目。它等待两个(或多个)项目到达,然后合并它们。所以是的,这将适合您的需求。

我会用它来链接前两个可观察量的结果。请注意,如果您使用 Retrofit,此方法会更简单,因为它的 api 接口可能会返回可观察量。否则,您需要创建自己的可观察量。Func2

// assuming each observable returns response in the form of String
Observable<String> movOb = Observable.create(...);
// if you use Retrofit
Observable<String> picOb = RetrofitApiManager.getService().uploadPic(...),
Observable.zip(movOb, picOb, new Func2<String, String, MyResult>() {
      @Override
      public MyResult call(String movieUploadResponse, String picUploadResponse) {
          // analyze both responses, upload them to another server
          // and return this method with a MyResult type
          return myResult;
      }
   }
)
// continue chaining this observable with subscriber
// or use it for something else

答案 2

一个小例子:

val observableOne = Observable.just("Hello", "World")
val observableTwo = Observable.just("Bye", "Friends")
val zipper = BiFunction<String, String, String> { first, second -> "$first - $second" }
Observable.zip(observableOne, observableTwo, zipper)
  .subscribe { println(it) }

这将打印:

Hello - Bye
World - Friends

在第一个可观察量的类型中,第二个是第二个可观察量的类型,第三个表示拉链函数返回的类型。BiFunction<String, String, String>StringStringString


我在这篇博客文章中做了一个小例子,使用zip调用两个真实的端点。


推荐