Saltar al contenido

AsyncTask como kotlin coroutine

Nuestro team de expertos pasados ciertos días de trabajo y recopilar de datos, han obtenido la solución, deseamos que resulte útil para ti para tu plan.

Solución:

Para usar una corrutina, necesita un par de cosas:

  • Implementar CoroutineScope interfaz.
  • Referencia a Trabajo y CoroutineContext instancias.
  • Usar suspender modificador de función para suspender una corrutina sin bloquear el Hilo principal al llamar a una función que ejecuta código en Hilo de fondo.
  • Usar withContext (Dispatchers.IO) función para ejecutar código en hilo de fondo y lanzamiento función para iniciar una corrutina.

Por lo general, uso una clase separada para eso, p. Ej. “Presentador” o “ViewModel”:

class Presenter : CoroutineScope 
    private var job: Job = Job()
    override val coroutineContext: CoroutineContext
        get() = Dispatchers.Main + job // to run code in Main(UI) Thread

    // call this method to cancel a coroutine when you don't need it anymore,
    // e.g. when user closes the screen
    fun cancel() 
        job.cancel()
    

    fun execute() = launch 
        onPreExecute()
        val result = doInBackground() // runs in background thread without blocking the Main Thread
        onPostExecute(result)
    

    private suspend fun doInBackground(): String = withContext(Dispatchers.IO)  // to run code in Background Thread
        // do async work
        delay(1000) // simulate async work
        [email protected] "SomeResult"
    

    // Runs on the Main(UI) Thread
    private fun onPreExecute() 
        // show progress
    

    // Runs on the Main(UI) Thread
    private fun onPostExecute(result: String) 
        // hide progress
    

Con ViewModel el código es más conciso usando viewModelScope:

class MyViewModel : ViewModel() 
    
    fun execute() = viewModelScope.launch 
        onPreExecute()
        val result = doInBackground() // runs in background thread without blocking the Main Thread
        onPostExecute(result)
    

    private suspend fun doInBackground(): String = withContext(Dispatchers.IO)  // to run code in Background Thread
        // do async work
        delay(1000) // simulate async work
        [email protected] "SomeResult"
    

    // Runs on the Main(UI) Thread
    private fun onPreExecute() 
        // show progress
    

    // Runs on the Main(UI) Thread
    private fun onPostExecute(result: String) 
        // hide progress
    

Usar viewModelScope agregue la siguiente línea a las dependencias de la aplicación build.gradle Archivo:

implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$LIFECYCLE_VERSION"

En el momento de escribir final LIFECYCLE_VERSION = "2.3.0-alpha04"

Puede hacer que ProgressBar se ejecute en el subproceso principal de la interfaz de usuario, mientras usa coroutine para ejecutar su tarea de forma asincrónica.

Dentro de su método override fun onCreate (),

GlobalScope.launch(Dispatchers.Main)  // Coroutine Dispatcher confined to Main UI Thread
    yourTask() // your task implementation

Puede inicializar,

private var jobStart: Job? = null

En Kotlin, la declaración var significa que la propiedad es mutable. Si lo declara como val, es inmutable, de solo lectura y no se puede reasignar.

Fuera del método onCreate (), yourTask () se puede implementar como una función de suspensión, que no bloquea el hilo principal de la llamada.

Cuando la función se suspende mientras se espera que se devuelva el resultado, su subproceso en ejecución se desbloquea para que se ejecuten otras funciones.

private suspend fun yourTask() = withContext(Dispatchers.Default) // with a given coroutine context
    jobStart = launch 
       try
        // your task implementation
        catch (e: Exception) 
             throw RuntimeException("To catch any exception thrown for yourTask", e)
      
    
  

Para su barra de progreso, puede crear un botón para mostrar la barra de progreso cuando se hace clic en el botón.

buttonRecognize!!.setOnClickListener 
    trackProgress(false)

Fuera de onCreate (),

private fun trackProgress(isCompleted:Boolean) 
    buttonRecognize?.isEnabled = isCompleted // ?. safe call
    buttonRecognize!!.isEnabled // !! non-null asserted call

    if(isCompleted) 
        loading_progress_bar.visibility = View.GONE
     else 
        loading_progress_bar.visibility = View.VISIBLE
    

Un consejo adicional es verificar que su corrutina se esté ejecutando en otro hilo, por ejemplo. DefaultDispatcher-trabajador-1,

Log.e("yourTask", "Running on thread $Thread.currentThread().name")

Espero que esto sea de ayuda.

Sección de Reseñas y Valoraciones

Si guardas algún contratiempo o capacidad de aclarar nuestro sección eres capaz de ejecutar una crítica y con gusto lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *