<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=PDM_Avanzado_AsyncTask</id>
	<title>PDM Avanzado AsyncTask - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=PDM_Avanzado_AsyncTask"/>
	<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=PDM_Avanzado_AsyncTask&amp;action=history"/>
	<updated>2026-10-23T13:36:56Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://manuais.iessanclemente.net/index.php?title=PDM_Avanzado_AsyncTask&amp;diff=53560&amp;oldid=prev</id>
		<title>Carrion: /* Definición de parámetros en AsyncTask */</title>
		<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=PDM_Avanzado_AsyncTask&amp;diff=53560&amp;oldid=prev"/>
		<updated>2015-02-23T08:45:24Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Definición de parámetros en AsyncTask&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Introdución==&lt;br /&gt;
&lt;br /&gt;
Máis información en: http://developer.android.com/reference/android/os/AsyncTask.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A [http://developer.android.com/reference/android/os/AsyncTask.html clase AsyncTask] vainos permitir facer o mesmo que un fío de execución ([http://manuais.iessanclemente.net/index.php/PDM_Avanzado_Threads#Introduci.C3.B3n visto anteriormente]) coa diferenza que &amp;#039;&amp;#039;&amp;#039;dende un AsyncTask imos poder ter acceso ós compoñentes gráficos&amp;#039;&amp;#039;&amp;#039; do fío principal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==AsyncTask==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ao crear unha clase que derive da clase AsyncTask, teremos acceso aos seguintes métodos:&lt;br /&gt;
 &lt;br /&gt;
* onPreExecute(). Executarase antes do código principal da nosa tarefa. &lt;br /&gt;
* doInBackground(). Código principal da nosa tarefa. Aquí é onde irá o código que poñemos no método run cando utilizamos un Thread.&amp;lt;u&amp;gt;Non temos acceso ós elementos gráficos&amp;lt;/u&amp;gt;&lt;br /&gt;
* onProgressUpdate(). Executarase cada vez que chamemos ó método publishProgress() dende o método doInBackground(). &lt;br /&gt;
* onPostExecute(). Executarase cando finalice a nosa tarefa (cando remate o método doInBackground(). &lt;br /&gt;
* onCancelled(). Executarase cando se cancele a execución da tarefa antes de súa finalización normal. &lt;br /&gt;
&lt;br /&gt;
O que nos interesa é a relación entre &amp;#039;&amp;#039;&amp;#039;doInBackground&amp;#039;&amp;#039;&amp;#039; é &amp;#039;&amp;#039;&amp;#039;onProgressUpdate&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Se poñemos dentro do código do método  doInBackground  a orde &amp;#039;&amp;#039;&amp;#039;publishProgress()&amp;#039;&amp;#039;&amp;#039;, automaticamente vai chamar ó método onProgressUpdate.&lt;br /&gt;
&lt;br /&gt;
O bo de todo é que  onProgressUpdate se executa no fío principal e polo tanto imos poder referenciar calquera elemento gráfico da interface, mentres que doInBackground se executa nun fío diferente.&lt;br /&gt;
&lt;br /&gt;
O resto de métodos tamén se executan no fío principal e polo tanto podemos ter acceso a todos os elementos gráficos do fío principal.&lt;br /&gt;
&lt;br /&gt;
==Definición de parámetros en AsyncTask==&lt;br /&gt;
O facer unha clase que derive de AsyncTask necesitamos definir tres parámetros:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;1&amp;quot; &amp;gt;&lt;br /&gt;
private class MiñaTarefa extends AsyncTask&amp;lt;Params, Progress, Result&amp;gt;{&lt;br /&gt;
		&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Params&amp;#039;&amp;#039;&amp;#039;: O tipo de dato que recibiremos como entrada no método doInBackground. Se non leva parámetros poñeremos Void (ningún). Podemos enviarlle datos cando dende a activity chamemos ó método execute da AsyncTask.&lt;br /&gt;
&lt;br /&gt;
É dicir, cando eu cre un obxecto da clase MiñaTarefa e poña:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;2&amp;quot; &amp;gt;&lt;br /&gt;
MiñaTarefa tarefa = new MiñaTarefa();&lt;br /&gt;
tarefa.execute(valor_enviar);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
No método execute podo enviarlle valores en forma de parámetros. Estes valores chegarán ó método doInBackGround en forma de parámetros. Cabe sinalar que podemos enviar varios valores separados por comas ou ben en forma dun array de valores de tipo que sexa.&lt;br /&gt;
&lt;br /&gt;
Se por exemplo, valor_enviar é un integer, teríamos que indicalo na clase MiñaTarefa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;1&amp;quot; &amp;gt;&lt;br /&gt;
private class MiñaTarefa extends AsyncTask&amp;lt;Integer, Progress, Result&amp;gt;{&lt;br /&gt;
		&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
No exemplo que imos desenvolver, non enviamos parámetros e por tanto quedaría como Void.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Progress&amp;#039;&amp;#039;&amp;#039;: O tipo de datos có que actualizaremos o progreso da tarefa. Cando chamamos o método publishProgress podemos enviarlle un parámetro e aquí indicamos o tipo de dato. &lt;br /&gt;
&lt;br /&gt;
Num exemplo que imos facer enviaremos un contador que indicará por onde ter que debuxarse unha barra de progreso e polo tanto será un Integer. Como comentamos anteriormente ó chamar ó método  publishProgress estamos chamando ó método onProgressUpdate que recibirá dito valor. Polo tanto teremos que definir un parámetro de tipo Integer nese método.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;1,5,9&amp;quot; &amp;gt;&lt;br /&gt;
private class MiñaTarefa extends AsyncTask&amp;lt;Void, Integer, Result&amp;gt;{&lt;br /&gt;
&lt;br /&gt;
     @Override&lt;br /&gt;
     protected Boolean doInBackground(Void... params) {&lt;br /&gt;
       	publishProgress(valor_integer);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     @Override&lt;br /&gt;
     protected void onProgressUpdate(Integer... values) {&lt;br /&gt;
	  int progreso = values[0].intValue();&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; Os &amp;#039;&amp;#039;&amp;#039;puntos suspensivos ...&amp;#039;&amp;#039;&amp;#039;  indican que se envía ou se pode enviar un array. Por iso cando o recibimos accedemos ó elemento 0 do array.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Result&amp;#039;&amp;#039;&amp;#039;: O tipo de dato que devolveremos cando finalice á nosa tarefa. Por exemplo, poderiamos indicar que cando finalice a tarefa esta enviará un Boolean. Ten que ser definido no método doInBackGround e o seu valor será recibido polo método onPostExecute, en forma de parámetro:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;1,4,7,10&amp;quot; &amp;gt;&lt;br /&gt;
private class MiñaTarefa extends AsyncTask&amp;lt;Void, Integer, Boolean&amp;gt;{&lt;br /&gt;
&lt;br /&gt;
  @Override&lt;br /&gt;
  protected Boolean doInBackground(Void... params) {&lt;br /&gt;
&lt;br /&gt;
	// CANDO FINALICE&lt;br /&gt;
	return true;&lt;br /&gt;
  }&lt;br /&gt;
  @Override&lt;br /&gt;
  protected void onPostExecute(Boolean result) {&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; Lembrar que indicamos tipos de datos: Void, Boolean, Integer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; Importar a clase AsyncTask premendo Ctrol+Shift+O.&lt;br /&gt;
&lt;br /&gt;
==Cancelando unha tarefa==&lt;br /&gt;
&lt;br /&gt;
Tanto dende a activity principal (a través do obxecto da clase MiñaTarefa) como dentro da propia AsyncTask podemos cancelar a tarefa.&lt;br /&gt;
&lt;br /&gt;
Nese caso, dentro do método doInBackGround, o método isCancelled() devolverá true.&lt;br /&gt;
Se cancelamos a tarefa, &amp;lt;u&amp;gt;non se chamará ó método onPostExecute&amp;lt;/u&amp;gt;, &amp;#039;&amp;#039;&amp;#039;se non a onCancelled&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Por exemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
	miñatarefa.cancel(true);		&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Nese caso, dentro do método doInBackGround, o método isCancelled() devolverá true.&lt;br /&gt;
Se cancelamos a tarefa, non se chamará ao método onPostExecute, se non a onCancelled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
private class MiñaTarefa extends AsyncTask&amp;lt;Void, Integer, Boolean&amp;gt;{&lt;br /&gt;
       ............&lt;br /&gt;
       @Override&lt;br /&gt;
        protected Boolean doInBackground(Void... params) {&lt;br /&gt;
	 &lt;br /&gt;
            	if(isCancelled())&lt;br /&gt;
            		return true;&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
       @Override&lt;br /&gt;
	protected void onCancelled() {&lt;br /&gt;
	            Toast.makeText(getApplicationContext(), &amp;quot;Tarefa cancelada!&amp;quot;,&lt;br /&gt;
	                Toast.LENGTH_SHORT).show();&lt;br /&gt;
	        }	&lt;br /&gt;
	};	&lt;br /&gt;
&lt;br /&gt;
       ............&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Caso práctico==&lt;br /&gt;
&lt;br /&gt;
O obxectivo desta práctica e ver o funcionamento dun AsyncTask. &lt;br /&gt;
&lt;br /&gt;
A práctica vai consistir en dous botóns cunha ProgressBar.&lt;br /&gt;
&lt;br /&gt;
[[Imagen:PDM_Avanzada_Threads_4.jpg | 400px | center]]&lt;br /&gt;
&lt;br /&gt;
Ao premer sobre o botón &amp;#039;Empezar&amp;#039; a barra de progreso se actualizará utilizando un AsyncTask.&lt;br /&gt;
Ao premer sobre o botón &amp;#039;Cancelar&amp;#039; o AsyncTask será cancelado e se informará ó usuario.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Creamos a activity===&lt;br /&gt;
&lt;br /&gt;
*Nome do proxecto: &amp;#039;&amp;#039;&amp;#039;UD3_02_AsyncTask&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*Nome da activity: &amp;#039;&amp;#039;&amp;#039;UD3_02_AsyncTask.java&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código do layout xml&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;RelativeLayout xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;&lt;br /&gt;
    xmlns:tools=&amp;quot;http://schemas.android.com/tools&amp;quot;&lt;br /&gt;
    android:layout_width=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
    android:layout_height=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
    tools:context=&amp;quot;.OutraActividade&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;Button&lt;br /&gt;
        android:id=&amp;quot;@+id/UD3_02_btnEmpezarAsync&amp;quot;&lt;br /&gt;
        android:layout_width=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
        android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
        android:layout_alignParentTop=&amp;quot;true&amp;quot;&lt;br /&gt;
        android:layout_centerHorizontal=&amp;quot;true&amp;quot;&lt;br /&gt;
        android:text=&amp;quot;EMPEZAR&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;ProgressBar&lt;br /&gt;
        android:id=&amp;quot;@+id/UD3_02_progressBarAsync&amp;quot;&lt;br /&gt;
        style=&amp;quot;?android:attr/progressBarStyleHorizontal&amp;quot;&lt;br /&gt;
        android:layout_width=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
        android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
        android:layout_centerHorizontal=&amp;quot;true&amp;quot;&lt;br /&gt;
        android:layout_centerVertical=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;Button&lt;br /&gt;
        android:id=&amp;quot;@+id/UD3_02_btnCancelarAsync&amp;quot;&lt;br /&gt;
        android:layout_width=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
        android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
        android:layout_alignLeft=&amp;quot;@+id/UD3_02_btnEmpezarAsync&amp;quot;&lt;br /&gt;
        android:layout_below=&amp;quot;@+id/UD3_02_btnEmpezarAsync&amp;quot;&lt;br /&gt;
        android:layout_marginTop=&amp;quot;18dp&amp;quot;&lt;br /&gt;
        android:text=&amp;quot;CANCELAR&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/RelativeLayout&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase UD3_02_AsyncTask&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Obxectivo:&amp;#039;&amp;#039;&amp;#039; Actualizar unha barra de progreso utilizando un AsyncTask.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;12,13,14,17-61,69,72,87,89-90&amp;quot; &amp;gt;&lt;br /&gt;
import android.app.Activity;&lt;br /&gt;
import android.os.AsyncTask;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.view.View.OnClickListener;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.ProgressBar;&lt;br /&gt;
import android.widget.Toast;&lt;br /&gt;
&lt;br /&gt;
public class UD3_02_AsyncTask extends Activity {&lt;br /&gt;
&lt;br /&gt;
	private static final int TEMPO_FINAL = 10;&lt;br /&gt;
	private ProgressBar barraProgreso;&lt;br /&gt;
	private MiñaTarefa miñaTarefa; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	private class MiñaTarefa extends AsyncTask&amp;lt;Void, Integer, Boolean&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
		@Override&lt;br /&gt;
		protected Boolean doInBackground(Void... params) {&lt;br /&gt;
			for (int i = 1; i &amp;lt;= TEMPO_FINAL; i++) {&lt;br /&gt;
				try {&lt;br /&gt;
					Thread.sleep(1000);&lt;br /&gt;
				} catch (InterruptedException e) {&lt;br /&gt;
					// TODO Auto-generated catch block&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
				publishProgress(i);&lt;br /&gt;
&lt;br /&gt;
				if (isCancelled())&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		@Override&lt;br /&gt;
		protected void onProgressUpdate(Integer... values) {&lt;br /&gt;
			int progreso = values[0].intValue();&lt;br /&gt;
			barraProgreso.setProgress(progreso);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		@Override&lt;br /&gt;
		protected void onPreExecute() {&lt;br /&gt;
			barraProgreso.setProgress(0);&lt;br /&gt;
			barraProgreso.setMax(TEMPO_FINAL);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		@Override&lt;br /&gt;
		protected void onPostExecute(Boolean result) {&lt;br /&gt;
			if (result) {&lt;br /&gt;
				Toast.makeText(getApplicationContext(), &amp;quot;Tarefa finalizada!&amp;quot;,&lt;br /&gt;
						Toast.LENGTH_SHORT).show();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		@Override&lt;br /&gt;
		protected void onCancelled() {&lt;br /&gt;
			Toast.makeText(getApplicationContext(), &amp;quot;Tarefa cancelada!&amp;quot;,&lt;br /&gt;
					Toast.LENGTH_SHORT).show();&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	private void xestionarEventos(){&lt;br /&gt;
		&lt;br /&gt;
		Button btnEmpezar = (Button)findViewById(R.id.UD3_02_btnEmpezarAsync);&lt;br /&gt;
		btnEmpezar.setOnClickListener(new OnClickListener() {&lt;br /&gt;
			&lt;br /&gt;
			@Override&lt;br /&gt;
			public void onClick(View v) {&lt;br /&gt;
				// TODO Auto-generated method stub&lt;br /&gt;
			&lt;br /&gt;
				if ((miñaTarefa==null) || (miñaTarefa.getStatus()==AsyncTask.Status.FINISHED)){&lt;br /&gt;
					miñaTarefa = new MiñaTarefa();&lt;br /&gt;
					miñaTarefa.execute();&lt;br /&gt;
				}&lt;br /&gt;
				else {&lt;br /&gt;
					Toast.makeText(getApplicationContext(), &amp;quot;A tarefa non acabou!!!&amp;quot;,&lt;br /&gt;
							Toast.LENGTH_SHORT).show();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		&lt;br /&gt;
		Button btnCancelar = (Button)findViewById(R.id.UD3_02_btnCancelarAsync);&lt;br /&gt;
		btnCancelar.setOnClickListener(new OnClickListener() {&lt;br /&gt;
&lt;br /&gt;
			@Override&lt;br /&gt;
			public void onClick(View v) {&lt;br /&gt;
				// TODO Auto-generated method stub&lt;br /&gt;
				if (miñaTarefa.getStatus()==AsyncTask.Status.RUNNING){&lt;br /&gt;
					miñaTarefa.cancel(true);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
		super.onCreate(savedInstanceState);&lt;br /&gt;
		setContentView(R.activity_ud3_02__async_task);&lt;br /&gt;
&lt;br /&gt;
		barraProgreso = (ProgressBar) findViewById(R.id.UD3_02_progressBarAsync);&lt;br /&gt;
		&lt;br /&gt;
		xestionarEventos();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Liña 12: Definimos o &amp;#039;tamaño&amp;#039; da barra de progreso.&lt;br /&gt;
* Liña 13: Referencia á barra de progreso.&lt;br /&gt;
* Liña 14: Definimos a tarefa (deriva de AsyncTask).&lt;br /&gt;
* Liñas 17-61: Definimos a clase que deriva de AsyncTask e que vai a actualizar a barra de progreso.&lt;br /&gt;
&lt;br /&gt;
* Liña 69: Xestionamos o evento de Click sobre o botón de &amp;#039;Comenzar&amp;#039;.&lt;br /&gt;
:* Liña 72: Para comenzar unha tarefa nova comprobamos que non fora instanciada ou ben rematara a anterior.&lt;br /&gt;
&lt;br /&gt;
* Liña 87: Xestionamos o evento de Click sobre o botón de &amp;#039;Cancelar&amp;#039;.&lt;br /&gt;
:* Liña 89-90: En caso de que a tarefa estea en execución a cancelamos.&lt;br /&gt;
&lt;br /&gt;
==Caso Práctico: Utilizando un ProgressDialog==&lt;br /&gt;
&lt;br /&gt;
Neste caso práctico anterior estamos a utilizar unha Activity para amosar un progreso.&lt;br /&gt;
&lt;br /&gt;
Normalmente utilizaremos un [http://developer.android.com/reference/android/app/ProgressDialog.html ProgressDialog].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un ProgressDialog. que como o seu propio nome di, é un tipo especial de diálogo no que se amosa unha barra de progreso (ou un texto).&lt;br /&gt;
O rango da barra de progreso pode ir dende 0 a 10.000.&lt;br /&gt;
&lt;br /&gt;
A idea é a de aproveitar o AsyncTask para amosar o diálogo actualizando o progreso no método onProgressUpdate, coma fixemos antes.&lt;br /&gt;
&lt;br /&gt;
Podemos facelo de varias formas, unha delas é:&lt;br /&gt;
&lt;br /&gt;
* Crear un obxecto da clase ProgressDialog:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
public class MiñaActivity extends Activity {&lt;br /&gt;
		.................&lt;br /&gt;
		private ProgressDialog meuProgresoDialog;&lt;br /&gt;
		...........&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Instanciamos dito obxecto no método onCreate:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;7&amp;quot; &amp;gt;&lt;br /&gt;
        @Override&lt;br /&gt;
	protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
		super.onCreate(savedInstanceState);&lt;br /&gt;
		setContentView(R.layout.activity_asysntask);&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		meuProgresoDialog = new ProgressDialog(this);&lt;br /&gt;
		MiñaTarefa miñatarefa = new MiñaTarefa();&lt;br /&gt;
		miñatarefa.execute();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Modificamos a AsyncTask para inicializar o diálogo de progreso:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
        @Override&lt;br /&gt;
        protected void onPreExecute() {&lt;br /&gt;
        	meuProgresoDialog.setTitle(&amp;quot;TAREFA&amp;quot;);&lt;br /&gt;
        	meuProgresoDialog.setMessage(&amp;quot;ACTUALIZANDO&amp;quot;);&lt;br /&gt;
        	meuProgresoDialog.setCancelable(false);&lt;br /&gt;
        	meuProgresoDialog.setIndeterminate(true);&lt;br /&gt;
        	meuProgresoDialog.show();&lt;br /&gt;
	        	&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Neste caso o  diálogo de progreso non é &amp;#039;cancelable&amp;#039;, cando vai rematar tampouco o sabemos (non vai aparecer unha barra de progreso que indique inicio – fin).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Pechamos o ProgressDialog ó rematar a tarefa:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
	@Override&lt;br /&gt;
        protected void onPostExecute(Boolean result) {&lt;br /&gt;
	            if(result)&lt;br /&gt;
	            {&lt;br /&gt;
	                Toast.makeText(ActivityAsysntask.this, &amp;quot;Tarefa finalizada!&amp;quot;,&lt;br /&gt;
	                    Toast.LENGTH_SHORT).show();&lt;br /&gt;
	            }&lt;br /&gt;
	            if (meuProgresoDialog!=null){&lt;br /&gt;
	            	meuProgresoDialog.dismiss();&lt;br /&gt;
	            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Por se acaso se cancela a tarefa tamén debemos pechar o diálogo:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void onCancelled() {&lt;br /&gt;
           Toast.makeText(ActivityAsysntask.this, &amp;quot;Tarefa cancelada!&amp;quot;,&lt;br /&gt;
                Toast.LENGTH_SHORT).show();&lt;br /&gt;
	&lt;br /&gt;
           if (meuProgresoDialog!=null){&lt;br /&gt;
            	  meuProgresoDialog.dismiss();&lt;br /&gt;
           }&lt;br /&gt;
       	}	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Existen outros métodos que podemos usar:&lt;br /&gt;
&lt;br /&gt;
Por exemplo, no noso caso sabemos cando remata a tarefa que será cando o contador chegue a 10.&lt;br /&gt;
Podemos modificar o diálogo indicándoo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
meuProgresoDialog.setCancelable(false);&lt;br /&gt;
meuProgresoDialog.setIndeterminate(false);&lt;br /&gt;
meuProgresoDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);&lt;br /&gt;
meuProgresoDialog.setMax(TEMPO_FINAL);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neste caso teremos que modificar a barra de progreso no método onProgressUpdate:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
	        @Override&lt;br /&gt;
	        protected void onProgressUpdate(Integer... values) {&lt;br /&gt;
	            int progreso = values[0].intValue();&lt;br /&gt;
	 &lt;br /&gt;
	            meuProgresoDialog.setProgress(progreso);&lt;br /&gt;
	        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Obtendo este resultado:&lt;br /&gt;
&lt;br /&gt;
[[Imagen:PDM_Avanzada_Threads_5.jpg | 400px | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Creamos a activity===&lt;br /&gt;
&lt;br /&gt;
*Nome do proxecto: &amp;#039;&amp;#039;&amp;#039;UD3_03_AsyncTask&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*Nome da clase: &amp;#039;&amp;#039;&amp;#039;UD3_03_AsyncTask.java&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* O código do layout é o mesmo que no exercicio anterior.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase UD3_03_AsyncTask&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Obxectivo:&amp;#039;&amp;#039;&amp;#039; Amosar o uso dun ProgressDialog xunto cun AsyncTask&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
import android.app.Activity;&lt;br /&gt;
import android.app.ProgressDialog;&lt;br /&gt;
import android.os.AsyncTask;&lt;br /&gt;
import android.os.Bundle;&lt;br /&gt;
import android.view.View;&lt;br /&gt;
import android.view.View.OnClickListener;&lt;br /&gt;
import android.widget.Button;&lt;br /&gt;
import android.widget.Toast;&lt;br /&gt;
&lt;br /&gt;
public class UD3_03_AsyncTask extends Activity {&lt;br /&gt;
&lt;br /&gt;
	private static final int TEMPO_FINAL = 10;&lt;br /&gt;
	private MiñaTarefa miñaTarefa; &lt;br /&gt;
&lt;br /&gt;
	private ProgressDialog meuProgresoDialog;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	private class MiñaTarefa extends AsyncTask&amp;lt;Void, Integer, Boolean&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
        @Override&lt;br /&gt;
        protected void onPreExecute() {&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
        	meuProgresoDialog.setTitle(&amp;quot;TAREFA&amp;quot;);&lt;br /&gt;
        	meuProgresoDialog.setMessage(&amp;quot;ACTUALIZANDO&amp;quot;);&lt;br /&gt;
        	meuProgresoDialog.setCancelable(false);&lt;br /&gt;
        	meuProgresoDialog.setIndeterminate(false);&lt;br /&gt;
        	meuProgresoDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);&lt;br /&gt;
        	meuProgresoDialog.setMax(TEMPO_FINAL);&lt;br /&gt;
        	meuProgresoDialog.show();&lt;br /&gt;
        	&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
		@Override&lt;br /&gt;
		protected Boolean doInBackground(Void... params) {&lt;br /&gt;
			for (int i = 1; i &amp;lt;= TEMPO_FINAL; i++) {&lt;br /&gt;
				try {&lt;br /&gt;
					Thread.sleep(1000);&lt;br /&gt;
				} catch (InterruptedException e) {&lt;br /&gt;
					// TODO Auto-generated catch block&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
				publishProgress(i);&lt;br /&gt;
&lt;br /&gt;
				if (isCancelled())&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		@Override&lt;br /&gt;
		protected void onProgressUpdate(Integer... values) {&lt;br /&gt;
			int progreso = values[0].intValue();&lt;br /&gt;
            meuProgresoDialog.setProgress(progreso);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		@Override&lt;br /&gt;
		protected void onPostExecute(Boolean result) {&lt;br /&gt;
			if (result) {&lt;br /&gt;
				Toast.makeText(getApplicationContext(), &amp;quot;Tarefa finalizada!&amp;quot;,&lt;br /&gt;
						Toast.LENGTH_SHORT).show();&lt;br /&gt;
			}&lt;br /&gt;
            if (meuProgresoDialog!=null){&lt;br /&gt;
            	meuProgresoDialog.dismiss();&lt;br /&gt;
            }&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		@Override&lt;br /&gt;
		protected void onCancelled() {&lt;br /&gt;
			Toast.makeText(getApplicationContext(), &amp;quot;Tarefa cancelada!&amp;quot;,&lt;br /&gt;
					Toast.LENGTH_SHORT).show();&lt;br /&gt;
&lt;br /&gt;
			if (meuProgresoDialog!=null){&lt;br /&gt;
	            	  meuProgresoDialog.dismiss();&lt;br /&gt;
	        }&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	private void xestionarEventos(){&lt;br /&gt;
		&lt;br /&gt;
		Button btnEmpezar = (Button)findViewById(R.id.UD3_02_btnEmpezarAsync);&lt;br /&gt;
		btnEmpezar.setOnClickListener(new OnClickListener() {&lt;br /&gt;
			&lt;br /&gt;
			@Override&lt;br /&gt;
			public void onClick(View v) {&lt;br /&gt;
				// TODO Auto-generated method stub&lt;br /&gt;
			&lt;br /&gt;
				if ((miñaTarefa==null) || (miñaTarefa.getStatus()==AsyncTask.Status.FINISHED)){&lt;br /&gt;
					miñaTarefa = new MiñaTarefa();&lt;br /&gt;
					miñaTarefa.execute();&lt;br /&gt;
				}&lt;br /&gt;
				else {&lt;br /&gt;
					Toast.makeText(getApplicationContext(), &amp;quot;A tarefa non acabou!!!&amp;quot;,&lt;br /&gt;
							Toast.LENGTH_SHORT).show();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		&lt;br /&gt;
		Button btnCancelar = (Button)findViewById(R.id.UD3_02_btnCancelarAsync);&lt;br /&gt;
		btnCancelar.setOnClickListener(new OnClickListener() {&lt;br /&gt;
&lt;br /&gt;
			@Override&lt;br /&gt;
			public void onClick(View v) {&lt;br /&gt;
				// TODO Auto-generated method stub&lt;br /&gt;
				if (miñaTarefa.getStatus()==AsyncTask.Status.RUNNING){&lt;br /&gt;
					miñaTarefa.cancel(true);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
		super.onCreate(savedInstanceState);&lt;br /&gt;
		setContentView(R.layout.activity_ud3_03__async_task);&lt;br /&gt;
&lt;br /&gt;
		meuProgresoDialog = new ProgressDialog(this);&lt;br /&gt;
		xestionarEventos();&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; -- [[Usuario:angelfg|Ángel D. Fernández González]] e [[Usuario:Carrion|Carlos Carrión Álvarez]] -- (2014).&lt;/div&gt;</summary>
		<author><name>Carrion</name></author>
	</entry>
</feed>