es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)
Tags:  ,

Answer

  1. Avatar for 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 de addOnSuccessListener. Esto se debe a que addOnCompleteListener se activa cuando la tarea se ha completado, independientemente de si fue exitosa o no, mientras que addOnSuccessListener solo se activa cuando la tarea se ha completado con éxito.

    Por lo tanto, tu código actualizado se vería así:

    fun setAppointmentStatus(docId: String, status: String, callback: (succeed: Boolean) -> Unit) {    
        db.collection(path)
            .document(docId)
            .update("status", status, "updatedAt", FieldValue.serverTimestamp())
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    callback(true)
                } else {
                    callback(false)
                }
            }
    }
    

    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.

Comments are closed.