我正在为kaltura视频平台开发Android客户端,现在我开发上传视频。此功能包括以下步骤:
创建MediaEntry
params:名称,描述
创建UploadToken
params: fileName , mediaEntryId (在步骤收到 1 )
addContent - 换句话说,将MediaEntry绑定到UploadToken
PARAMS:的 mediaEntryId (其位于步骤中接收1 )的 uploadTokenId (其位于步骤2接收)
- 醇>
uploadVideo PARAMS:的 uploadTokenId (其位于步骤中接收2 )的可视数据
这是我使用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();
答案 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(), , , ))
)
)
...