【问题标题】:How to start second observable after receiving result from first observable in android?从android中的第一个可观察对象接收结果后如何启动第二个可观察对象?
【发布时间】:2018-06-16 19:02:56
【问题描述】:

我不知道如何在第二个 observable 中使用第一个 observable 的结果。

 -> My First Observable

var uploadImgObservable = Observable.create<File> {....}

  -> My Second Observable

var thumbnailObservable =  Observable.create<Task<UploadTask.TaskSnapshot>> {...}   

现在我想在 thumbnailObservable 中使用 uploadImgObservable 的结果。 我也尝试按照stackoverflow的建议使用flatmap,但我没有得到它.. 这就是我在 observable 中使用 flatmap 的方式..

  Observable.create<Task<UploadTask.TaskSnapshot>> { e ->

        firebaseStorageReference.child("profile_images").child(current_user_uid+"_thumbnail"+ ".jpg").putFile(imageFile)
                .addOnCompleteListener { task: Task<UploadTask.TaskSnapshot> ->
                    e.onNext(task)
                    e.onComplete()
                }
    }.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .unsubscribeOn(Schedulers.io())
                .flatMap(object : Function<Task<UploadTask.TaskSnapshot>,Observable<File>>{
                    override fun apply(t: Task<UploadTask.TaskSnapshot>): Observable<File> {
                        var compressedImageBitmap = compress?.setMaxWidth(640)
                                ?.setMaxHeight(480)
                                ?.setQuality(70)
                                ?.setCompressFormat(Bitmap.CompressFormat.WEBP)
                                ?.setDestinationDirectoryPath(Environment.getExternalStoragePublicDirectory(
                                        Environment.DIRECTORY_PICTURES).getAbsolutePath())
                                ?.compressToFile(actualImageFile)
                        return Observable.just(compressedImageBitmap)
                    }
                })?.subscribe(object : Observer<File>{
            override fun onNext(t: File) {

            }

            override fun onError(e: Throwable) {

            }

            override fun onComplete() {

            }

            override fun onSubscribe(d: Disposable) {

            }
        })

正如您在使用 flatmap 后看到的那样,Observable&lt;Task&lt;UploadTask.TaskSnapshot&gt;&gt; 转换为 Observable&lt;File&gt; 但我不想在使用第一个 observable 的结果后转换 observable 的类型。 我应该怎么做才能在第二个 observable 中使用第一个 observable 的结果?

【问题讨论】:

    标签: android kotlin observable rx-java2 subscriber


    【解决方案1】:

    flatMap 的名称中包含“映射”,这意味着它将某个值映射到另一个值。但是你能做的是

    firstObservable.flatMap(firstObservableResult ->
                    secondObservable
                            .flatMap(secondObservableResult -> Observable.just(firstObservableResult)))
                .subscribe(firstObservableResult-> {
                    // process request data
                });
    

    希望你仍然理解 Java 代码。

    【讨论】:

    • 你为什么使用 Completable 以及它在这里的作用?
    • 我没有清楚明白你想要什么,我会修改我的答案,让它做你想要的
    • 对不起,我打错了代码,它现在可以工作了,感谢Tuby的帮助..
    • 如果要修改firstObservableResult怎么办?
    • flatMapsubscribe 之前使用.map(),取决于用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 2017-07-12
    • 2019-02-18
    相关资源
    最近更新 更多