Threads

Threads

  • Nos permiten ejecutar procesos en paralelo
  • Deberían realizar las operaciones no instantáneas (que podrían bloquear nuestro proceso principal)
  • Operaciones que se ejecuten constantemente (encuesta: progressbar)
  • No pueden modificar elementos de la vista:
    • View.post(Runnable)
    • View.postDelayed(Runnable, long)

Ejemplo

new Thread(new Runnable() {
    public void run() { 
        int i = 0; 
        while (i < 10000) { 
             Thread.sleep(1000); 
             Log.v(”thread”,”awake”); 
             i += 1000; 
        } 
    } 
}).start(); 

Thread th = new Thread(..... ); 
th.start(); th.interrupt();

AsyncTask

  • Encapsula la creación de un proceso en segundo plano y la sincronización con el hilo principal.
  • También nos permite publicar el progreso de la tarea en segundo plano.

 

  • Para usarla debemos extenderla.
  • Las AsyncTask usan parámetros genéricos y varargs (argumentos variables):

 

AsyncTask <TypeOfVarArgParams , ProgressValue , ResultValue> .

AsyncTask

  • onPreExecute():
    • Se ejecutará antes del código principal de nuestra tarea.
    • Se suele utilizar para preparar la ejecución de la tarea, inicializar la interfaz, etc.
  • doInBackground():
    • Contendrá el código principal de nuestra tarea.
  • onProgressUpdate():
    • Se ejecutará cada vez que llamemos al método publishProgress() desde el métododoInBackground().

AsyncTask

  • onPostExecute():
    • Se ejecutará cuando finalice nuestra tarea, o dicho de otra forma, tras la finalización del métododoInBackground().
  • onCancelled():
    • Se ejecutará cuando se cancele la ejecución de la tarea antes de su finalización normal.

AsyncTask

Ejemplo

public void onClick(View v) { 
    MyTask task = new MyTask(); 
    task.execute(4); 
    task.cancel(); 
} 

private class MyTask extends AsyncTask<Integer, Integer, String> { 

    @Override 
    protected String doInBackground(Integer... param) { 
        //hacer operaciones
        publishProgress(int); //actualizar progreso
        return resultado; 
    } 
    
    @Override    
    protected void onPostExecute(String result) { 
        tView.setText(result); //dialog, toast.. lo que queramos
        super.onPostExecute(); 
    }

Ejemplo

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values[0]);
        Log.i( ”task", ”progress update: " + String.valueOf( values[0] ) );
    }
    
    @Override 
    protected void onPreExecute() { //inicializaciones
        Log.i( "task", "on preExecute" );
        super.onPreExecute(); 
    }
    
    @Override
    protected void onCancelled() { //fin 
        Log.i( "task", "on cancelled" ); 
        super.onCancelled();
    }

}

Handler

  • Thread que ejecuta operaciones, envía resultados a proceso principal 
  • Utiliza elementos de la clase Message para enviar los resultados
  • Se envían mediante handler (se reciben en el handler del proceso principal) 
  • Proceso principal obtiene argumentos y actúa en consecuencia

Clase IntentService

  • Mejora de la clase Service, implementaciones

    por defecto y threads: 

    • Crea un thread para ejecutar todos los intents que lleguen a onStartCommand() 

    • Cola de trabajo para todos los intents, se envían uno a uno a onHandleIntent() 

    • Se para solo mediante stopSelf() cuando acaba

    • Implementación por defecto de onBind(), return null 

    • Implementación por defecto de onStartCommand(), 

      que envía los Intent a la función onHandleIntent()

Threads

By marcos_perez

Threads

  • 653