Android erroe: no se puede llamar a este método mientras RecyclerView está calculando un diseño o desplazándose

Android Erroe Cannot Call This Method While Recyclerview Is Computing Layout

Encontré este problema en el proyecto hoy y lo registré en este caso para evitar futuros olvidos. Por cierto, se recuerda el mecanismo Handler.

Primero, la primera solución



La operación de actualización de los datos se realiza mediante un Handler.



|_+_|

En segundo lugar, ¿por qué es este CRASH?



Desde el aspecto literal de CRASH, se produce al llamar al método notifyDataSetChanged en el diseño RecyclerView o en el proceso de desplazamiento.
El comportamiento específico en el proyecto es: cuando la diapositiva izquierda o derecha elimina el elemento, se llama a notifyDataSetChanged para actualizar la fuente de datos.

Mira el CRASH específico

|_+_|

En RecyclerView, cuando el Adaptador de RecyclerView actualiza los datos, el método de assertNotInLayoutOrScroll () se ejecuta de acuerdo con el flujo.
asertNotInLayoutOrScroll () Este método se puede ver en el nombre del método para detectar si se está colocando o desplazándose.



|_+_|

En él, es juzgado por isComputingLayout ()

|_+_|

La variable o indicador mLayoutOrScrollCounter será mLayoutOrScrollCounter ++ al comienzo del dibujo mLayoutOrScrollCounter--

Desde el registro, mi método onItemClear () está solo en el proceso de dibujo, es decir, mLayoutOrScrollCounter no es cero en este momento. Por lo tanto, llamar a notifyDataSetChanged () directamente en onItemClear () se CRASH.

En tercer lugar, ¿por qué utilizar el procesamiento de Handler?

Los estudiantes que comprenden el mecanismo de mensajes de Android deben saber que la actualización de la interfaz de usuario en Android se logra realmente a través del mecanismo de mensajes. A través del mensaje
se distribuye para diferentes procesamientos.

También se puede ver en las últimas líneas del registro.

|_+_|

Utilice el método Handler.post para poner un bloque de método Runnable en MessageQueue [primero en entrar, primero en salir, luego en entrar y salir] para esperar la ejecución. El Looper del hilo principal recorrerá los mensajes en esta cola. En general, este proceso es en serie. Entonces, cuando use Handle.post, el mensaje de actualización de la interfaz de usuario se digerirá primero. Cuando el Looper elimina el mensaje de publicación de MessageQueue, se ejecutará la operación [Actualización de la fuente de datos].

Pero en este momento, el dibujo de RecyclerView se ha completado y mLayoutOrScrollCounter se ha establecido en 0, por lo que la fuente de datos se puede actualizar correctamente.

vuelta: https://www.jianshu.com/p/353d401fbd99