如何在 android 中收到来自第一个 observable 的结果后启动第二个 observable?
How to start second observable after receiving result from first observable in android?
我不知道如何在第二个可观察对象中使用第一个可观察对象的结果。
-> My First Observable
var uploadImgObservable = Observable.create<File> {....}
-> My Second Observable
var thumbnailObservable = Observable.create<Task<UploadTask.TaskSnapshot>> {...}
现在我想在 thumbnailObservable 中使用 uploadImgObservable 的结果。
我也尝试按照 Whosebug 的建议使用平面图,但我没有得到它 ..
这就是我在 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>
但我不想在使用第一个可观察对象的结果后转换可观察对象的类型。
我应该怎么做才能在第二个可观察对象中使用第一个可观察对象的结果?
flatMap
的名称中有 "map",这意味着它将把一些值映射到另一个值。但是你能做的是
firstObservable.flatMap(firstObservableResult ->
secondObservable
.flatMap(secondObservableResult -> Observable.just(firstObservableResult)))
.subscribe(firstObservableResult-> {
// process request data
});
希望您仍然理解 Java 代码。
我不知道如何在第二个可观察对象中使用第一个可观察对象的结果。
-> My First Observable
var uploadImgObservable = Observable.create<File> {....}
-> My Second Observable
var thumbnailObservable = Observable.create<Task<UploadTask.TaskSnapshot>> {...}
现在我想在 thumbnailObservable 中使用 uploadImgObservable 的结果。 我也尝试按照 Whosebug 的建议使用平面图,但我没有得到它 .. 这就是我在 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>
但我不想在使用第一个可观察对象的结果后转换可观察对象的类型。
我应该怎么做才能在第二个可观察对象中使用第一个可观察对象的结果?
flatMap
的名称中有 "map",这意味着它将把一些值映射到另一个值。但是你能做的是
firstObservable.flatMap(firstObservableResult ->
secondObservable
.flatMap(secondObservableResult -> Observable.just(firstObservableResult)))
.subscribe(firstObservableResult-> {
// process request data
});
希望您仍然理解 Java 代码。