Alpha Code Labs | Video Tutoriales y Aplicaciones M&oacuteviles

Thread VS AsynkTask

Existen básicamente dos maneras de realizar tareas intensivas o de larga ejecución de procesador: los hilos (Threads), y las tareas asíncronas nativas de Android (AsyncTask).

Ninguno de los dos es necesariamente mejor que el otro, pero saber cuándo utilizar cada una es esencial para el aprovechamiento de las prestaciones del sistema para su beneficio.

Utilizar las tareas asíncronas nativas (AsyncTask) para:

* Operaciones de red simples que no requieren la descarga de una gran cantidad de datos.

* Tareas de escritura de datos que pueden durar unos pocos milisegundos.

Utilizar los hilos (Thread) para:

* Operaciones de red que implican moderadas a grandes cantidades de datos (ya sea de carga o descarga).

* Tareas de alto procesamiento, que necesitan ser ejecutadas en segundo plano.

* Cualquier tarea en la que se desea controlar el uso del procesador en relación con el hilo de la interfaz gráfica.

Código del ejemplo

Crear cadenas de texto

Archivo strings.xml

<string name="app_name">tutorial</string>
<string name="action_settings">Settings</string>
<string name="titulo_asynk">Utilizando AsyncTask</string>
<string name="comenzar">Comenzar descarga</string>
<string name="titulo_thread">Utilizando Thread</string>

Crear Layout utilizado en MainActivity.java

A continuación vamos a crear un LinearLayout con la estructura necesaria para nuestro ejemplo.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
   
android:orientation="vertical"
   
android:background="#F5F5F5"
   
android:paddingBottom="@dimen/activity_vertical_margin"
   
android:paddingLeft="@dimen/activity_horizontal_margin"
   
android:paddingRight="@dimen/activity_horizontal_margin"
   
android:paddingTop="@dimen/activity_vertical_margin"
   
app:layout_behavior="@string/appbar_scrolling_view_behavior"
   
tools:context="com.alphacodelabs.tutorial.MainActivity"
   
tools:showIn="@layout/activity_main">

    <TextView
       
android:id="@+id/tv_tituloasynk"
       
android:layout_width="match_parent"
       
android:layout_height="wrap_content"
       
android:text="@string/titulo_asynk"
        
android:textSize="20sp"
       
android:typeface="sans"
       
android:textStyle="bold"/>

    <Button
       
android:id="@+id/tv_botonasynk"
       
android:layout_width="match_parent"
       
android:layout_height="wrap_content"
       
android:onClick="ComenzarDescargaAsincrona"
       
android:text="@string/comenzar"/>

    <TextView
       
android:id="@+id/tv_titulothread"
       
android:layout_width="match_parent"
       
android:layout_height="wrap_content"
       
android:text="@string/titulo_thread"
       
android:textSize="20sp"
       
android:typeface="sans"
       
android:textStyle="bold"/>

    <Button
       
android:id="@+id/tv_botonthread"
       
android:layout_width="match_parent"
       
android:layout_height="wrap_content"
        
android:onClick="ComenzarDescargaThread"
       
android:text="@string/comenzar"/>
   
    <ImageView
       
android:layout_width="match_parent"
       
android:layout_height="100dp"
       
android:id="@+id/imagen_web"
       
android:scaleType="centerInside"
       
android:layout_gravity="center_horizontal" />
   
</LinearLayout>

Utilizando Asynktask y Thread en MainActivity.java

Simularemos la descarga de una imagen creando un hilo secundario desde el cual llamaremos al hilo principal para notificar de la descarga finalizada y mostraremos una imagen en pantalla. Tambien crearemos una tarea asíncrona y simularemos otra descarga utlizando una barra de progreso en un diálogo que actualizará el progreso de la descarga desde la tarea asíncrona.

public class MainActivity extends AppCompatActivity {

    private ProgressDialog dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        dialog = new ProgressDialog(this);
        dialog.setTitle("Descargando...");
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.setCancelable(false);

    }

    private class MiTarea extends AsyncTask<String, Float, Integer> {

        protected void onPreExecute() {
            dialog.setProgress(0);
            dialog.setMax(100);
            dialog.show();
        }

        protected Integer doInBackground(String... urls) {

            for (int i = 0; i < 50; i++) {
                try {
                    Thread.sleep(100);
                }
                catch (InterruptedException e) {

                }

                publishProgress(i/50f);
            }

            return 500;
        }

        protected void onProgressUpdate (Float... valores) {
            int prog = Math.round(100*valores[0]);
            dialog.setProgress(prog);
        }

        protected void onPostExecute(Integer bytes) {
            dialog.dismiss();
        }
    }

    public void ComenzarDescargaAsincrona(View v) {

        new MiTarea().execute();
    }

    public void ComenzarDescargaThread(View v) {
        new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(5000);
                }
                catch (InterruptedException e) {

                }
                //Enviar operaciones al hilo principal desde uno secundario
               
MainActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "Descarga finalizada!", Toast.LENGTH_LONG).show();
                        ((ImageView) findViewById(R.id.imagen_web)).setImageResource(R.drawable.principal);
                    }
                });
            }
        }).start();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
       
int id = item.getItemId();

        //noinspection SimplifiableIfStatement
       
if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


}



Aquí te dejamos el video tutorial de Thread VS AsynkTask.