如何从android中的第一个observable接收结果后启动第二个observable?

时间:2018-01-07 16:59:04

标签: android kotlin observable rx-java2 subscriber

我没有得到如何在第二个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<Task<UploadTask.TaskSnapshot>>会转换为Observable<File>但我不想在使用第一个observable的结果后转换observable的类型。 我应该怎样做才能在第二个可观测量中使用第一个可观察的结果?

1 个答案:

答案 0 :(得分:0)

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

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

希望您仍然了解Java代码。