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();
Handlers
- Nos permite enviar y procesar mensajes y Runnables asociados a un Thread.
- Un handler está ligado al thread donde se crea.
- Usos principales:
- Para programar tareas.
- Para sincronizar / comunicar threads.
- Funciones disponibles:
Handlers
- funciones post:
- Para poner en la cola el Runnable a ejecutar
- funciones message:
- Para poner en la cola el Message a ejecutar con datos extra
- La función delayed:
- Para ejecutar delay antes de ejecutarlo.
Runnable
Interfície que define una función Run que será ejecutada desde un thread.
Message
Clase que contiene un mensaje y una descripción que serán enviados a un Handler.
Ejemplo Handler

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 <Params, Progress, Result>
AsyncTask
- 4 pasos
-
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 mediante la función cancel(boolean);
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();
}
}
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()
-
18 - Threads
By androidjedi
18 - Threads
- 531