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