RxJava缓存中间结果

时间:2015-04-23 08:38:18

标签: reactive-programming rx-java

我正在为kaltura视频平台开发Android客户端,现在我开发上传视频。此功能包括以下步骤:

  
      
  1. 创建MediaEntry

         

    params:名称,描述

  2.   
  3. 创建UploadToken

         

    params: fileName mediaEntryId (在步骤收到   1

  4.   
  5. addContent - 换句话说,将MediaEntry绑定到UploadToken

         

    PARAMS:的 mediaEntryId (其位于步骤中接收1 )的 uploadTokenId (其位于步骤2接收

  6.   
  7. uploadVideo PARAMS:的 uploadTokenId (其位于步骤中接收2 )的可视数据

  8.   

这是我使用RxJava的代码:

API.createMediaEntry(name, description)
                    .flatMap(mediaEntry -> {
                        mediaEntryId = mediaEntry.getId();
                        return API.createUploadToken(this.videoUri.getPath(), mediaEntry.getId());
                    })
                    .flatMap(uploadToken -> {
                        uploadTokenId = uploadToken.getId();
                        return API.addContent(mediaEntryId, uploadToken.getId());
                    })
                    .flatMap(mediaEntry -> API.uploadVideo(uploadTokenId, FileUtil.getTypedVideoFileFromUri(this.videoUri, UploadVideoActivity.this)))
                    .doOnError(throwable -> {
                        throwable.printStackTrace();
                        dismissProgressDialog();
                    })
                    .doOnNext(response -> {

                    })
                    .doOnCompleted(() -> {
                        dismissProgressDialog();
                    })
                    .subscribe();

其中API是Retrofit rest adapter。

正如从代码中看到的,我需要保存的 mediaEntryId 是在步骤1 ,和 uploadTokenId 是在步骤2 ,在第3步中使用它们。 我想已了解,有一个方法,以节省的 mediaEntry 步骤1 uploadToken 步骤2 使用他们以后,或者可能有某种方法来改变我的代码,排除将数据保存到局部变量?

对我来说理想的解决方案如下:

API.createMediaEntry(name, description)
                    .doSomeThingWithMedaiEntry(mediaEntry -> mediaEntry)
                    .flatMap(mediaEntry -> API.createUploadToken(this.videoUri.getPath(), mediaEntry.getId()))
                    .doSomeThingWithUploadToken(token -> token)
                    .getMediaEntryAndUploadTokenSomehow((mediaEntry, uploadToken) -> API.addContent(mediaEntry.getId(), uploadToken.getId()))
                    .getUploadTokenSomehow(uploadToken -> API.uploadVideo(uploadToken.getId(), FileUtil.getTypedVideoFileFromUri(this.videoUri, UploadVideoActivity.this)))
                    .doOnError(throwable -> {
                        throwable.printStackTrace();
                        dismissProgressDialog();
                    })
                    .doOnNext(response -> {

                    })
                    .doOnCompleted(() -> {
                        dismissProgressDialog();
                    })
                    .subscribe();

1 个答案:

答案 0 :(得分:1)

除了使用元组之外,您还可以嵌套Observables。

API.createMediaEntry(name, description)
    .flatMap(createdMediaEntry -> API.createUploadToken(this.videoUri.getPath(), createdMediaEntry.getId())
                    .flatMap(uploadToken -> API.addContent(createdMediaEntry.getId(), uploadToken.getId())
                                    .flatMap(addedMediaEntry -> API.uploadVideo(uploadToken.getId(), , , ))
                    )
    )
    ...