Mostrando las entradas con la etiqueta AsyncTask. Mostrar todas las entradas
Mostrando las entradas con la etiqueta AsyncTask. Mostrar todas las entradas
Vamos a programar #58 - AsyncTask en java.
Hola de nuevo a todos, el día de hoy vamos a ver cómo usar la clase "AsyncTask" para proveer de un poco de multi-threading a una aplicación.
En el la aplicacion de los números de Muchhausen, vimos que empleamos una subclase llamada "UpdateList" que hereda de "AsyncTask", el nombre de la clase es bastante descriptivo, puesto que lo que hace es ejecutar una tarea de forma asíncrona.
la clase AsyncTask posee los siguientes metodos:
Para tener una idea de cómo funciona, retomemos el ejemplo de los números de Munchhausen. Para empezar, ¿qué es lo queremos hacer?, en este caso buscamos crear una lista de resultados en la que indiquemos si un número n cumple o no la conjetura. entonces para construir la clase AsyncTask de acuerdo a nuestros requerimientos, puede ser de la siguiente forma: private class UpdateList extends AsyncTask<Integer,Void,ArrayList> y cada parametro corresponde a:
Ahora veamos el siguiente código:
Los leo luego.
En el la aplicacion de los números de Muchhausen, vimos que empleamos una subclase llamada "UpdateList" que hereda de "AsyncTask", el nombre de la clase es bastante descriptivo, puesto que lo que hace es ejecutar una tarea de forma asíncrona.
la clase AsyncTask posee los siguientes metodos:
- doInBackground(Params... params).
- Este método se debe de sobrecargar para poder realizar una tarea de forma asíncrona.
- onCancelled(Result result)
- Se ejecuta en el hilo principal despúes de que cancel(boolean) es invocado o doInBackground(Object[]) ha terminado.
- onPostExecute(Result result).
- Se ejecuta cuando doInBackground(Params...) ha terminado su ejecución.
- OnPreExecute()
- Se ejecuta en el hilo principal antes que doInBackground(Params...).
- onProgressUpdate(Progress... values)
- Este método se ejecuta despúes de que publishProgress(Progress...) is invoked.
- publishProgress(Progress... values)
- Este método puede ser invocado desde doInBackground(Params...) para actualizar elementos en el hilo principal.
Para tener una idea de cómo funciona, retomemos el ejemplo de los números de Munchhausen. Para empezar, ¿qué es lo queremos hacer?, en este caso buscamos crear una lista de resultados en la que indiquemos si un número n cumple o no la conjetura. entonces para construir la clase AsyncTask de acuerdo a nuestros requerimientos, puede ser de la siguiente forma: private class UpdateList extends AsyncTask<Integer,Void,ArrayList> y cada parametro corresponde a:
- Integer, son los parametros que se usaran en doInBackground(), son del tipo integer porque son los números que vamos a usar cómo limites inferior y superior, y un tercero que se usará para indicar si se deben mostrar o no todos los números.
- Void, el segundo parametro cómo en eeste caso no mostramos ningún progreso en concreto, simplemente mostramos el dialogo de forma indeterminada, usualmente suele ser un valor Integer.
- ArrayList, debido a que todos los resultados de los calculos los guardamos en un "ArrayList", para poder usar esa lista cómo resultado de la ejecución, debemos de hacerlo del mismo tipo, si por alguna razón nuestro proceso debe de devolver un valor "boolean", "String" o etc. el tercer parametro debe de ser de ese tipo.
Ahora veamos el siguiente código:
// Original de https://developer.android.com/reference/android/os/AsyncTask
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
Esta clase se construye de la siguiente forma: DownloadFilesTask extends AsyncTask<URL, Integer, Long>, suponiendo que se llame a ejecutar con los siguientes parametros: "URL1", "URL2","URL3","URL4"..."URL10". El parámetro URL contendrá estos diez valores distintos entonces en "doInBackground(URL.. urls)" lo que se hace es primero asignar los parámetros a la variable "urls" y luego medir los elementos con "urls.length" y cada parámetro pasado al momento de iniciar la ejecución, estará en esta matriz. EL resultado de "doInBackground" es del tipo "Long" que usaremos en "onPostExecute" para mostrar al usuario cuantos bytes se descargaron. Cada vez que se ejecute "publishProgress()" en "doInBackGround()", se ejecutará "onProgressUpdate()", en esta parte es donde debemos de cambiar cualquier indicador de progreso. finalmente en "onPostExecute()", mostraremos un dialogo con la información de cuantos bytes se descargaron.
Y bien, por ahora es todo, en el siguiente post añadiremos una barra de progreso y entenderemos mejor cómo y cuando debemos de hacer uso de "AsyncTask".
![]() |
| En post anteriores ya hemos usado "AsyncTask" |
Y bien, por ahora es todo, en el siguiente post añadiremos una barra de progreso y entenderemos mejor cómo y cuando debemos de hacer uso de "AsyncTask".
Los leo luego.
9/02/2018 04:31:00 p.m.
android
,
AsyncTask
,
java
,
programacion
Vamos a programar #57 - Los números de Munchhausen (ver. Java android)
Hola de nuevo a todos, el día de hoy vamos a ver cómo probar los números de Munchhausen en java para usarse en dispositivos con android.
El código ha cambiado un poco, en el caso de la función "IsMunchhuasenNumber()", todo se mantiene igual, es decir; se prueba un número y si este cumple la conjetura, la funcion devuelve "true", en caso contrario se devuelve "false".
La función "TestNumbers", es la que sufrido varios cambios. Para empezar, los parámetros que está recibe, los primeros dos se mantienen del tipo "int", pero el tercer parámetro pasa a ser del tipo "boolean" al tipo "int", esto solo hace por practicidad, un poquito más adelante veremos el por qué. Otro de los cambios que sufre, es que ahora pasa a ser una función en vez de un procedimiento. El valor que regresa es un valor del tipo "ArrayList", que es la lista en la cual se van almacenado los valores de salida. Cada vez que se prueba la conjetura para un número, se regresa una cadena de texto similar a "el número n no/cumple la conjetura", en la versión de C#, directamente se usaba el delegado y la función "UpdateList()" para hacerlo pero en este y debido a cómo está estructurado, pensé que era mejor hacerlo así.
A diferencia de los muchos otros códigos que he dicho que voy a "optimizar" (y que no he hecho), este ahora si usa un "Thread" diferente para hacer los cálculos y que no se bloquee la interfaz principal, para eso hacemos uso de la Subclase "UpdateList" que hereda de la clase "AsyncTask" (no se si sea en valido decir "hereda" en java, pero creo que si o si no se entiende). En el post de la semana que viene, veremos cómo usar esta clase para poder brindar un poco de "Multithreading", pero por ahora, al crear la instancia, pasamos tres parámetros que son "<Integer, Void, ArrayList>". Para poder usar la clase "AsyncTask", debemos de sobrecargar algunos de los metodos que la componen, en este caso solo son tres (pero hay más) y son: "onPreExecute()", "doInBackground()" y "onPostExecute()". Respectivamente cada uno hace lo siguiente: Es lo que se ejecutará antes de empezar, la parte principal y que mas tiempo va a consumir y la parte donde se procesaran los resultados.
Con el código anterior podemos probar los números de Munchhausen en un dispositivo con android, en el siguiente post veremos cómo es que funciona la clase "AsyncTask" y cómo nos podra ayudar con tareas en segundo plano. El código cómo de costumbre lo pongo en mi dropbox para que lo descargues, recuerda que a partir de este post, solo ira el código del layout principal y el código java. El APK ya compilado lo puedes descargar de mi dropbox directamente o puedes visitar la seccion de descargas del blog.
Y bien, por ahora es todo, los leo luego.
El código.
Cómo ya vimos cuales son las reglas de los números de Munchhausen en el primer post, ahora pasaremos directamente al código en java para poder usarlo. El código es el siguiente:
package com.mdev.munchhausen;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity extends Activity {
Button BtnDowork;
TextView TXTMin, TxtMax;
CheckBox CHKShowAll;
ListView ShowResults;
private ProgressDialog progress;
private boolean IsMunchhausenNumber(String Number)
{
int Value = 0;
int CurrentNumber = 0;
char[] Digits = Number.toCharArray();
for (int i = 0; i < Digits.length; i++)
{
CurrentNumber = Digits[i] - 48;
Value += (int)Math.pow(CurrentNumber,CurrentNumber);
}
String CurrentVal = String.valueOf(Value);
if (Number.compareTo(CurrentVal) == 0)
return true;
else
return false;
}
private ArrayList TestNumbers(int BeginNumber, int EndNumber, int ShowAll)
{
ArrayList TempList = new ArrayList();
for (int i = BeginNumber; i <= EndNumber; i++)
{
if (IsMunchhausenNumber(String.valueOf(i)))
TempList.add( "La conjetura se cumple para el número " + i);
else if (ShowAll == 1)
TempList.add( "El número " + i + " no cumple la conjetura");;
}
return TempList;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BtnDowork = (Button)findViewById(R.id.BtnDoWork);
TXTMin = (TextView)findViewById(R.id.TXTInMin);
TxtMax = (TextView)findViewById(R.id.TXTInMax);
CHKShowAll = (CheckBox)findViewById(R.id.CHKShowAll);
ShowResults = (ListView) findViewById(R.id.LVResults);
BtnDowork.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Integer ShowAll = 0;
Integer Min = Integer.valueOf(TXTMin.getText().toString());
Integer Max = Integer.valueOf(TxtMax.getText().toString());
if (CHKShowAll.isChecked())
ShowAll = 1;
else
ShowAll = 0;
new UpdateList().execute(Min,Max,ShowAll);
}
}
);
}
private class UpdateList extends AsyncTask<Integer,Void,ArrayList>
{
@Override
protected void onPreExecute()
{
progress = ProgressDialog.show(MainActivity.this, "Espera...", "Espera...!!!");
}
@Override
protected ArrayList doInBackground(Integer... Limits)
{
ArrayList Lista = new ArrayList();
Lista = TestNumbers(Limits[0],Limits[1],Limits[2]);
return Lista;
}
@Override
protected void onPostExecute(ArrayList result)
{
super.onPostExecute(result);
final ArrayAdapter adapter = new ArrayAdapter(MainActivity.this,android.R.layout.simple_list_item_1, result);
ShowResults.setAdapter(adapter);
progress.dismiss();
}
}
}
El código ha cambiado un poco, en el caso de la función "IsMunchhuasenNumber()", todo se mantiene igual, es decir; se prueba un número y si este cumple la conjetura, la funcion devuelve "true", en caso contrario se devuelve "false".
La función "TestNumbers", es la que sufrido varios cambios. Para empezar, los parámetros que está recibe, los primeros dos se mantienen del tipo "int", pero el tercer parámetro pasa a ser del tipo "boolean" al tipo "int", esto solo hace por practicidad, un poquito más adelante veremos el por qué. Otro de los cambios que sufre, es que ahora pasa a ser una función en vez de un procedimiento. El valor que regresa es un valor del tipo "ArrayList", que es la lista en la cual se van almacenado los valores de salida. Cada vez que se prueba la conjetura para un número, se regresa una cadena de texto similar a "el número n no/cumple la conjetura", en la versión de C#, directamente se usaba el delegado y la función "UpdateList()" para hacerlo pero en este y debido a cómo está estructurado, pensé que era mejor hacerlo así.
A diferencia de los muchos otros códigos que he dicho que voy a "optimizar" (y que no he hecho), este ahora si usa un "Thread" diferente para hacer los cálculos y que no se bloquee la interfaz principal, para eso hacemos uso de la Subclase "UpdateList" que hereda de la clase "AsyncTask" (no se si sea en valido decir "hereda" en java, pero creo que si o si no se entiende). En el post de la semana que viene, veremos cómo usar esta clase para poder brindar un poco de "Multithreading", pero por ahora, al crear la instancia, pasamos tres parámetros que son "<Integer, Void, ArrayList>". Para poder usar la clase "AsyncTask", debemos de sobrecargar algunos de los metodos que la componen, en este caso solo son tres (pero hay más) y son: "onPreExecute()", "doInBackground()" y "onPostExecute()". Respectivamente cada uno hace lo siguiente: Es lo que se ejecutará antes de empezar, la parte principal y que mas tiempo va a consumir y la parte donde se procesaran los resultados.
Con el código anterior podemos probar los números de Munchhausen en un dispositivo con android, en el siguiente post veremos cómo es que funciona la clase "AsyncTask" y cómo nos podra ayudar con tareas en segundo plano. El código cómo de costumbre lo pongo en mi dropbox para que lo descargues, recuerda que a partir de este post, solo ira el código del layout principal y el código java. El APK ya compilado lo puedes descargar de mi dropbox directamente o puedes visitar la seccion de descargas del blog.
Y bien, por ahora es todo, los leo luego.
8/19/2018 01:51:00 p.m.
android
,
AsyncTask
,
java
,
munchhausen
,
programacion
Suscribirse a:
Entradas
(
Atom
)




