RxJava: cómo devolver el tipo correcto de nulo

Estoy desarrollando una aplicación usando Firebase, Kotlin y RxJava.

Básicamente, lo que tengo que hacer es registrar a un usuario usando Auth de Firebase, si el usuario seleccionó una foto, suba la foto y luego guarde al usuario en la database de Firebase.

Hasta ahora tengo esto

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() 

Está funcionando correctamente cuando el usuario selecciona una foto, pero cuando no está seleccionada, los otros maps se ignoran, porque devolví Maybe.empty ().

¿Cómo debo implementar esto para trabajar con o sin una foto de usuario?

Gracias.

Eche un vistazo a la siguiente construcción:

  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"); }) 

Debería lanzar un error si encuentra un nulo, y luego usar el onErrorReturn{} o onErrorReturnItem() para devolver un valor pnetworkingeterminado que se pasará a la siguiente cadena de operador sin saltar a onError en Observer .

Entonces su código debería verse así:

 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() 

Pero hay un problema con este código de que se produjo una exception antes de que onErrorReturn produzca un uri en blanco y dé como resultado una ejecución de cadena adicional que no queremos. Si se produce cualquier otra exception enError se debe invocar.

Para eso tenemos que crear una class Exception personalizada y atrapar esta exception lanzada en onErrorReturn . Eche un vistazo al siguiente 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 } ... ... 

Espero eso ayude.

  • RxJava: anular la suscripción asincrónica observable desde dentro de otra producción asincrónica
  • Reemplazar el doble para cada uno por observable
  • ¿Pasar lambdas a Observable.subscribe en kotlin dará como resultado pérdidas de memory?
  • Cómo manejar el event handling errores en un solo lugar en rxjava usando wrapper
  • Cómo get el valor del ObservableField en android
  • RxJava Observable.create envolver suscripciones observables
  • Android: uso de generics para tener 1 llamada de actualización de RxJava que devuelve varios types usando la misma interfaz
  • No se puede hacer que la API invoque urlfetch.Fetch en un hilo que no sea el hilo de request original ni un hilo creado por ThreadManager
  • Escuchar posts y escribir commands en un flujo observable
  • RxJava: onBackpressureBlock () comportamiento extraño
  • Cómo burlarse del repository reactivo que devuelve Observable