RxJava 缓存中间结果

RxJava cache intermediate results

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

  1. create MediaEntry

    params: name, description

  2. create UploadToken

    params: fileName, mediaEntryId(which received at step 1)

  3. addContent - in other words bind MediaEntry to UploadToken

    params: mediaEntryId(which received at step 1), uploadTokenId(which received at step 2)

  4. uploadVideo params: uploadTokenId(which received at step 2), videoData

这是我使用 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 支架适配器。

正如您从代码中看到的,我需要在 步骤 1uploadTokenId[=] 中保存 mediaEntryId 32=] 在 步骤 2,在 步骤 3 使用它们。 我想了解一下,有没有办法从 step 1 中保存 mediaEntry 和 [=] 中的 uploadToken 23=]步骤 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();

除了使用元组之外,您还可以嵌套 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(), , , ))
                    )
    )
    ...