Ejecutar subproceso de interfaz de usuario en Android usando Kotlin

El subproceso de interfaz de usuario o UI-Thread en Android es un elemento de subproceso responsable de actualizar los elementos de diseño de la aplicación de forma implícita o explícita. Esto significa que, para actualizar un elemento o cambiar sus atributos en el diseño de la aplicación, es decir, el front-end de la aplicación, uno puede hacer uso de UI-Thread. 

Realización de subprocesos de interfaz de usuario: 
por ejemplo, se inicia una acción de subproceso y el desarrollador desea actualizar el elemento front-end con respecto a los elementos del subproceso, se puede usar la función runOnUIThread{…} .
A continuación se muestra un ejemplo de la aplicación en la que se utiliza el subproceso de interfaz de usuario. 

Aplicación de muestra en la que el texto en TextView se cambia cada segundo 
 

Inicialmente, la aplicación mostrará un mensaje de Bienvenida y tan pronto como se haga clic en el botón de inicio , mostrará 2 mensajes, «love gfg» y «not gfg» alternativamente en cada segundo. 

Enfoque:  
Paso 1: agregue el siguiente código en activity_main.xml . Aquí, agregue un TextView y un botón a nuestro diseño MainActivity.

HTML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
    <TextView
        android:id="@+id/tv1"
        android:layout_width="210sp"
        android:layout_height="100sp"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:textSize="50sp"
        android:text="Welcome"
        />
 
    <Button
        android:id="@+id/btnStart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start"
        android:layout_below="@id/tv1"
        android:layout_centerHorizontal="true"
        />
 
</RelativeLayout>

Paso 2: agregue el siguiente código en MainActivity. Aquí OnClickListener se agrega con el botón. Por lo tanto, se invoca cada vez que el usuario hace clic en el botón. En el oyente, se crea un bucle infinito en el hilo principal y, utilizando el hilo de la interfaz de usuario, el texto cambia cada segundo. 

Java

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        // Assigning Layout elements
        val tv = findViewById<TextView>(R.id.tv1)
        val btn = findViewById<Button>(R.id.btnStart)
        val msg1 = "love gfg" val msg2 = "not gfg"
 
        // Button onClick action
        btn.setOnClickListener
        {
            // Declaring Main Thread
            Thread(Runnable {
                while (true) {
                    // Updating Text View at current
                    // iteration
                    runOnUiThread{ tv.text = msg1 }
 
                    // Thread sleep for 1 sec
                    Thread.sleep(1000)
                    // Updating Text View at current
                    // iteration
                    runOnUiThread{ tv.text = msg2 }
 
                    // Thread sleep for 1 sec
                    Thread.sleep(1000)
                }
            }).start()
        }
    }
}

Nota: El bucle While debe declararse solo dentro del Thread. Si se declara un subproceso dentro de un ciclo while, el programa no funciona y falla.

Aplicación de temporizador de muestra 
A partir del concepto básico del código anterior, se puede diseñar una aplicación de temporizador. A continuación se muestra el código para el mismo: 

Enfoque:  
Paso 1: agregue el siguiente código en el diseño de MainActivity. Aquí se agregan un botón, texto de edición y vista de texto. El botón se usa para iniciar el temporizador, edittext se usa para tomar la entrada del usuario y textview se usa para mostrar el tiempo restante. 

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
    <Button
        android:id="@+id/btnStart"
        android:layout_width="100sp"
        android:layout_height="50sp"
        android:layout_centerInParent="true"
        android:text="Start"
        />
 
    <EditText
        android:id="@+id/et1"
        android:layout_width="100sp"
        android:layout_height="100sp"
        android:layout_centerHorizontal="true"
        android:layout_above="@id/btnStart"
        android:textSize="50sp"
        android:inputType="number"
        android:gravity="center"
        android:background="@color/colorPrimary"
        android:textColor="@color/colorAccent"
        />
 
    <TextView
        android:id="@+id/tv1"
        android:layout_width="100sp"
        android:layout_height="100sp"
        android:layout_centerHorizontal="true"
        android:layout_below="@id/btnStart"
        android:gravity="center"
        android:textSize="50sp"
        android:background="@color/colorPrimaryDark"
        android:textColor="@color/colorAccent"
        />
 
</RelativeLayout>

Paso 2: agregue el siguiente código en la clase MainActivity. Aquí agregamos el onClickListener con el botón. A medida que se hace clic en el botón, se utiliza la función runOnUiThread para mostrar el tiempo restante.

Java

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        // Assigning Layout elements
        val et = findViewById<EditText>(R.id.et1)
        val btn = findViewById<Button>(R.id.btnStart)
        val tv = findViewById<TextView>(R.id.tv1)
 
              // Button onClick action
        btn.setOnClickListener{
            // Converting Edit Text input to String
            val stringTime= (et.text).toString()
            // Converting stringTime to Integer
            val intTime= Integer.parseInt(stringTime)
            // Declaring Main Thread
             Thread(Runnable {
                  // For loop Decrement
                  for (i in intTime downTo 0) {
                       // Updating Text View at
                       // current iteration
                        runOnUiThread{
                            tv.text = i.toString()
                         }
 
                   // Thread sleep for 1 sec
                        Thread.sleep(1000)
                          }
                      }).start()
        }
    }
}

Publicación traducida automáticamente

Artículo escrito por aashaypawar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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