【问题标题】:Concat two completable RxJava连接两个可完成的 RxJava
【发布时间】:2018-04-21 19:17:11
【问题描述】:

我的目标是连接completable1completable2[0]。在doOnComplete() 之后,我使用mContent 创建缩略图。我尝试了上面的代码,但它不起作用。

Completable  completable1;

final Completable[] completable2 = new Completable[1];

completable1 = AppManagers.getContentManager()
    .completeCopy(mContent)
    .toCompletable()
    .doOnComplete(() -> {
        File file = new 
        File(ImageUtils.getThumbNailPathsForLocalContent(mContent.getId(), 0));
        if (!file.exists()) {
            final ContentVideoCache videoCache = 
                AppManagers.getAppContext().getVideoCache();
            Uri dataURI = videoCache.getDataURI(mContent);
            completable2[0] = AppManagers.getContentManager()
                .createThumbnails(mContent.getId(), dataURI)
                .toCompletable();
        }
    });
    completable = completable1.concatWith(completable2[0]);

更新:如果completeCopy(mContent)返回mContent的不同对象

 Completable completable = AppManagers.getContentManager()
                                .copyIntoShell((Content) selectedContent, mContent)
                                .flatMapCompletable(new Function<Content, CompletableSource>() {
                                    @io.reactivex.annotations.NonNull
                                    @Override
                                    public CompletableSource apply(@io.reactivex.annotations.NonNull Content content) throws Exception {
                                        return generateThumbnailsForNewContent(content);
                                    }
                                });

在这之后如果我subscribecompletable,那会在return generateThumbnailsForNewContent(content); 完成之后完成吧?

 private Completable generateThumbnailsForNewContent(Content mContent) {
        File file = new File(ImageUtils.getThumbNailPathsForLocalContent(mContent.getId(), 0));
        if (!file.exists()) {
            final ContentVideoCache videoCache = AppManagers.getAppContext().getVideoCache();
            Uri dataURI = videoCache.getDataURI(mContent);
            return AppManagers.getContentManager().createThumbnails(mContent.getId(), dataURI).toCompletable();
        }
        return Completable.error(new FileNotFoundException());
    }

【问题讨论】:

    标签: android rx-java rx-java2


    【解决方案1】:

    不确定您在这里尝试完成什么,但andThendefer 是拥有dependent-deferred continuations 的运算符:

    AppManagers.getContentManager()
    .completeCopy(mContent)
    .toCompletable()
    .andThen(Completable.defer(() -> {
        File file = new File(ImageUtils.getThumbNailPathsForLocalContent(
            mContent.getId(), 0));
    
        if (!file.exists()) {
            final ContentVideoCache videoCache = 
                AppManagers.getAppContext().getVideoCache();
    
            Uri dataURI = videoCache.getDataURI(mContent);
    
            return AppManagers.getContentManager()
                .createThumbnails(mContent.getId(), dataURI)
                .toCompletable();
        }
        return Completable.error(new FileNotFoundException());
    }));
    

    【讨论】:

    • 我也有completeCopy(mContent)返回mContent的不同对象的情况,我可以在Completable.defer(() -&gt; {...}中获取该对象吗?
    • 什么意思?您通过toCompletable() 选择退出任何值,因此您无法以这种方式获取值。
    • 啊,好吧,我想我应该在.completeCopy(mContent) 之后使用.flatMapCompletablereturn AppManagers.getContentManager() .createThumbnails(mContent.getId(), dataURI) .toCompletable();generateThumbnailsForNewContent(content);,这样在.flatMapCompletable 完成它的返回动作之后,completable 将被编译,对吧?跨度>
    • 我不明白。请提供您正在尝试的代码。
    • 您可以尝试自己的想法并更快地得到答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多