gpt4 book ai didi

android - RxJava : how to return the correct type of null

转载 作者:太空狗 更新时间:2023-10-29 13:51:51 25 4
gpt4 key购买 nike

我正在使用 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()

当用户选择一张照片时它工作正常,但当它没有被选中时,其他 map 将被忽略,因为我返回了 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() 运算符返回将传递给 next 的默认值不跳转到 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 并导致我们不希望的进一步链执行。如果发生任何其他异常,则应调用 onError。

为此,我们需要创建一个自定义异常类并在 onErrorReturn 中捕获这个抛出的异常。看看下面的 fragment :

...
...

.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

}
...
...

希望对您有所帮助。

关于android - RxJava : how to return the correct type of null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45788800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com