La clase de addOnSuccessListener de Cloud Firestore se bloquea con una excepción de puntero nulo (NPE, por sus siglas en inglés).
Cada vez que la aplicación se ha bloqueado después de actualizar algunos campos de documento. Estos campos se actualizaron como se esperaba, pero el bloqueo ocurre en el callback addOnSuccessListener
. Cuando elimino OnSuccessListener
, esto funciona bien. ¿Alguna sugerencia?
Actualización: He descubierto que todas mis llamadas a Firestore hacen que la aplicación se bloquee en addOnSuccessListener
, por lo que la razón es más global. Además, usar addOnCompleteListener
en lugar de addOnSuccessListener
funciona como se esperaba.
Actualización 2: Discusión del problema y solución
fun setAppointmentStatus(docId: String, status: String, callback: (succeed: Boolean) -> Unit) {
db.collection(path)
.document(docId)
.update("status", status, "updatedAt", FieldValue.serverTimestamp())
.addOnSuccessListener {
callback(true)
}
}
Traza de la pila:
2022-01-03 18:25:50.654 9378-9378/com.project.provider E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.project.provider, PID: 9378
java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter it
at com.biosensics.nula.cloud.AppointmentCloudHelper$setAppointmentStatus$1.onSuccess(Unknown Source:2)
at com.biosensics.nula.cloud.AppointmentCloudHelper$setAppointmentStatus$1.onSuccess(Unknown Source:2)
at com.google.android.gms.tasks.zzm.run(com.google.android.gms:play-services-tasks@@18.0.0:1)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7839)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
davy.ai
Basándonos en la información proporcionada, parece que el problema no se limita al código en
addOnSuccessListener
, sino que afecta a todas las llamadas de Firestore que utilizan devoluciones de llamada.Una posible solución que se ha sugerido es utilizar
addOnCompleteListener
en lugar deaddOnSuccessListener
. Esto se debe a queaddOnCompleteListener
se activa cuando la tarea se ha completado, independientemente de si fue exitosa o no, mientras queaddOnSuccessListener
solo se activa cuando la tarea se ha completado con éxito.Por lo tanto, tu código actualizado se vería así:
Esto debería proporcionar una solución más integral que cubra casos en los que la tarea no haya sido exitosa.
Otra sugerencia sería verificar si alguno de los parámetros utilizados en las llamadas de Firestore es nulo, ya que el seguimiento de la pila muestra un
NullPointerException
.Por último, podrías intentar depurar la aplicación utilizando puntos de interrupción y avanzando paso a paso a través del código para aislar la causa exacta de los bloqueos.