Corrutinas en Kotlin

Cómo usar corrutinas en Kotlin

 

Corrutinas en Kotlin 1.3: funciones de suspensión, contexts, builders y scopes

 

dependencies {


    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9")
}

Crear el proyecto CorrutinasKotlin

Añadir viewBinding

buildFeatures {
    viewBinding = true
}

Añadir dependencias

// implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
implementation(libs.kotlinx.coroutines.android)

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="70dp"
        android:layout_marginBottom="43dp"
        android:text="Proceso 1"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        app:layout_constraintBottom_toTopOf="@+id/countNumber"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/countNumber"
        android:layout_width="136dp"
        android:layout_height="150dp"
        android:text="0"
        android:textAlignment="center"
        android:textSize="60sp"
        app:layout_constraintBottom_toTopOf="@+id/countButton"
        app:layout_constraintEnd_toEndOf="@+id/countButton"
        app:layout_constraintStart_toStartOf="@+id/countButton"
        app:layout_constraintTop_toBottomOf="@+id/textView1" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="10dp"
        android:layout_marginBottom="41dp"
        android:text="Proceso 2"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        app:layout_constraintBottom_toTopOf="@+id/downloadNumber"
        app:layout_constraintEnd_toEndOf="@+id/countButton"
        app:layout_constraintTop_toBottomOf="@+id/countButton" />

    <TextView
        android:id="@+id/downloadNumber"
        android:layout_width="258dp"
        android:layout_height="36dp"
        android:text="0"
        android:textAlignment="center"
        app:layout_constraintBottom_toTopOf="@+id/downloadButton"
        app:layout_constraintEnd_toEndOf="@+id/downloadButton"
        app:layout_constraintStart_toStartOf="@+id/downloadButton"
        app:layout_constraintTop_toBottomOf="@+id/textView3" />

    <Button
        android:id="@+id/countButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="125dp"
        android:layout_marginBottom="85dp"
        android:text="Start counting"
        app:layout_constraintBottom_toTopOf="@+id/textView3"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/countNumber" />

    <Button
        android:id="@+id/downloadButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="150dp"
        android:text="Start downloading"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/downloadNumber" />
</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.kt

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private var counter: Int = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.countButton.setOnClickListener {
            binding.countNumber.text = counter++.toString()
        }

        binding.downloadButton.setOnClickListener {
            for (i in 1..10000) {
                Log.i("TAG", "Downloading $i in ${Thread.currentThread().name}")
            }
        }
    }
}

Uso de una corrutina:

binding.downloadButton.setOnClickListener {
    binding.downloadButton.isEnabled = false
    CoroutineScope(Dispatchers.IO).launch {
        for (i in 1..10000) {
            Log.i("TAG", "Downloading $i in ${Thread.currentThread().name}")
            // binding.downloadNumber.text = i.toString()
            // runOnUiThread(){
            withContext(Dispatchers.Main) {
                    binding.downloadNumber.text = i.toString()
            }
        }
        withContext(Dispatchers.Main) {
            binding.downloadButton.isEnabled = true
        }
    }
}

 

Más información

Domina las Corrutinas

Código en Github

Coroutines con Kotlin — Introducción

Codelab: Cómo usar corrutinas de Kotlin en tu app para Android

Deja una respuesta