Rxjava Android如何使用Zip运算符

fei*_*ong 50 java android rx-java

我在为我的android项目理解RxJava中的zip操作符时遇到了很多麻烦.问题我需要能够发送网络请求上传视频然后我需要发送网络请求上传图片最后我需要添加说明并使用前两个请求的响应上传视频和图片的位置网址以及我的服务器的说明.

我认为zip操作符对于此任务是完美的,因为我知道我们可以接受两个可观察量(视频和图片请求)的响应并将它们用于我的最终任务.但我似乎无法让这种情况发生在我想象中.

我正在寻找一个人来回答如何用一些伪代码在概念上完成这个.谢谢

inm*_*yth 67

Zip运算符严格地配对来自observable的发射项.它等待两个(或更多)项目到达然后合并它们.所以是的,这将适合您的需求.

我会Func2用来链接前两个observable的结果.请注意,如果您使用Retrofit,这种方法会更简单,因为它的api接口可能会返回一个observable.否则你需要创建自己的observable.

// 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
Run Code Online (Sandbox Code Playgroud)


Evi*_*n1_ 25

一个小例子:

Observable<String> stringObservable1 = Observable.just("Hello", "World");
Observable<String> stringObservable2 = Observable.just("Bye", "Friends");

Observable.zip(stringObservable1, stringObservable2, new BiFunction<String, String, String>() {
    @Override
    public String apply(@NonNull String s, @NonNull String s2) throws Exception {
        return s + " - " + s2;
    }
}).subscribe(new Consumer<String>() {
    @Override
    public void accept(String s) throws Exception {
        System.out.println(s);
    }
});
Run Code Online (Sandbox Code Playgroud)

这将打印:

Hello - Bye
World - Friends
Run Code Online (Sandbox Code Playgroud)