Si encuentras alguna parte que no comprendes puedes dejarlo en la sección de comentarios y trataremos de ayudarte lo mas rápido que podamos.
Solución:
Después de llamar books = task.await()
estás fuera del hilo de la interfaz de usuario. Es porque usas CoroutineScope(Dispatchers.Default)
. cambiarlo a Dispatchers.Main
:
fun loadData() = CoroutineScope(Dispatchers.Main).launch
loadingIndicator.visibility = View.VISIBLE
val task = async(Dispatchers.IO)
get_top_books()
books = task.await()
viewAdapter.notifyDataSetChanged()
loadingIndicator.visibility = View.INVISIBLE
Después de llamar books = task.await()
estás fuera del hilo de la interfaz de usuario. Debe ejecutar todo el código relacionado con la interfaz de usuario en el hilo principal. Para hacer esto puedes usar Dispatchers.Main
.
CoroutineScope(Dispatchers.Main).launch
viewAdapter.notifyDataSetChanged()
loadingIndicator.visibility = View.INVISIBLE
o usando Handler
Handler(Looper.getMainLooper()).post
viewAdapter.notifyDataSetChanged()
loadingIndicator.visibility = View.INVISIBLE
O puedes usar Activty
instancia para llamar runOnUiThread
método.
activity!!.runOnUiThread
viewAdapter.notifyDataSetChanged()
loadingIndicator.visibility = View.INVISIBLE
Cambiando el Dispatchers.Default
a Dispatchers.Main
y actualizar mi versión de kotlinx-coroutines-android
a 1.1.1
Hizo el truco.
Cambiando
val task = async(Dispatchers.IO)
get_top_books()
books = task.await()
a
books = withContext(Dispatchers.IO)
get_top_books()
también es un poco más elegante. Gracias a todos los que respondieron, especialmente a @DominicFischer, que tuvo la idea de verificar mis dependencias.
Valoraciones y reseñas
Al final de la artículo puedes encontrar las ilustraciones de otros administradores, tú todavía puedes mostrar el tuyo si te apetece.