RxJava:如何返回null的正确类型
我正在开发一个使用Firebase,Kotlin和RxJava的应用程序。
基本上,我需要做的是使用Firebase中的Auth注册用户,如果用户选择了一张照片,上传照片,然后将用户从Firebase中保存到数据库中。
到现在为止,我有这个
RxFirebaseAuth.createUserWithEmailAndPassword(auth, email, password) .map { authResult -> user.uid = authResult.user.uid authResult.user.uid } .flatMap<UploadTask.TaskSnapshot>( { uid -> if (imageUri != null) RxFirebaseStorage.putFile(mFirebaseStorage .getReference(STORAGE_IMAGE_REFERENCE) .child(uid), imageUri) else Maybe.empty<UploadTask.TaskSnapshot>() } ) .map { taskSnapshot -> user.photoUrl = taskSnapshot.downloadUrl!!.toString() } .map { RxFirebaseDatabase .setValue(mFirebaseDatabase.getReference("user") .child(user.uid), user).subscribe() } .doOnComplete { appLocalDataStore.saveUser(user) } .toObservable()
当用户选择一张照片时,它正常工作,但是当它没有被选中时,其他地图被忽略,因为我返回了Maybe.empty()。
我应该如何实现这个使用或不使用用户照片?
谢谢。
看看下面的构造:
val temp = null Observable.just("some value") .flatMap { // Throw exception if temp is null if (temp != null) Observable.just(it) else Observable.error(Exception("")) } .onErrorReturnItem("") // return blank string if exception is thrown .flatMap { v -> Single.create<String>{ // do something it.onSuccess("Yepeee $v"); }.toObservable() } .subscribe({ System.out.println("Yes it worked: $it"); },{ System.out.println("Sorry: $it"); })
如果遇到null,则应该抛出一个错误,然后使用onErrorReturn{}
或onErrorReturnItem()
运算符返回一个默认值,该值将传递给下一个运算符链,而不会跳到Observer
onError
。
所以你的代码应该是这样的:
RxFirebaseAuth.createUserWithEmailAndPassword(auth, email, password) .map { authResult -> user.uid = authResult.user.uid authResult.user.uid } .flatMap<UploadTask.TaskSnapshot>( { uid -> if (imageUri != null) RxFirebaseStorage.putFile(mFirebaseStorage .getReference(STORAGE_IMAGE_REFERENCE) .child(uid), imageUri) else Observable.error<Exception>(Exception("null value")) // Throw exception if imageUri is null } ) .map { taskSnapshot -> user.photoUrl = taskSnapshot.downloadUrl!!.toString() } .onErrorReturn { user.photoUrl = "" // assign blank url string if exception is thrown } .map { RxFirebaseDatabase .setValue(mFirebaseDatabase.getReference("user") .child(user.uid), user).subscribe() } .doOnComplete { appLocalDataStore.saveUser(user) } .toObservable()
但是这个代码存在一个问题,那就是在onErrorReturn
之前发生的任何异常都会产生一个空的uri,并导致我们不需要的进一步的链执行。 如果发生任何其他异常,则应调用Error。
为此我们需要创建一个自定义的Exception类,并在onErrorReturn
捕获这个抛出的异常。 看看下面的代码片段:
... ... .flatMap<UploadTask.TaskSnapshot>( { uid -> if (imageUri != null) RxFirebaseStorage.putFile(mFirebaseStorage .getReference(STORAGE_IMAGE_REFERENCE) .child(uid), imageUri) else Observable.error<MyCustomException>(MyCustomException("null value")) // Throw exception if imageUri is null } ) .map { taskSnapshot -> user.photoUrl = taskSnapshot.downloadUrl!!.toString() } .onErrorReturn { if(it !is MyCustomException) throw it else user.photoUrl = "" // assign blank url string if exception is thrown } ... ...
希望它有帮助。
- ListView.CHOICE_MODE_SINGLE未解决的参考
- Firebase AdMob引发IncompatibleClassChangeError
- 如何在Anko上使用selectableButtonBackground?
- 'when'语句跳过Kotlin for Android的条件
- 调用File.createNewFile()时,权限被拒绝 Android的
- Kotlin setOnclickListener
- 从Java转换到Kotlin时出错。 错误 – org.gradle.api.tasks.TaskExecutionException:任务执行失败:app:compileDebugKotlin'
- kotlin android开始新的服务
- 在Android Studio中Kotlin构建失败