PDA

Ver la Versión Completa : [ CONSULTA ] ejecutar while hasta apretar un boton


zamudiofabian
07/05/12, 22:53:40
Quiero un programa bien facil para entender un punto fundamental en la programacion.

mi idea es tener 1 TextView que muestre numero del 1 al 10 hasta que aprete un Button

Luego de entender el funcionamiento de esto lo llevare a otros programas mas complejos .Gracias

tompad28
08/05/12, 01:17:49
Para hacer esto, creo que lo más correcto es usar un AsyncTask (http://developer.android.com/reference/android/os/AsyncTask.html).

Es necesario que primero entiendas a fondo lo que hace. Lo más importante en una aplicación android es no bloquear el hilo principal de la interfaz de usuario, porque si no bloquearás a su vez la interacción del usuario con tu aplicació. Si la quiere cerrar, no podrá, por poner un ejemplo.

La AsyncTask lo que hace es ejecutar parte del código en un hilo paralelo, en particular el que se ejecuta dentro del método doInBackground. Este método a su vez puede comunicarse siempre que quiera con otro (onProgressUpdate) mediante la llamada al método publishProgress.

Lo que yo haría:

en "doInBackground" crear algún delay para parar algo la ejecución (si no se va a modificar tan rápido que ni lo verás), y cuando pase ese delay llamar a publishProgress. Para hacer esto, créate un while con la condición "while (!isCanceled()), ahora te explico por qué.

en onProgressUpdate actualizas tu TextView y ya está.

En tu Activity tendrás el botón, que en el onclick tendrá que hacer: asyncTask.cancel(true). Esto hará que la próxima vez que el doInBackground pase por isCanceled(), le devuelva un true y se salga del bucle, finalizando la tarea, y detieniendo por tanto el incremento del textView.

La AsyncTask es una funcionalidad muy importante, y aprenderla te ayudará mucho. Todo código que pueda bloquear momentáneamente el flujo de ejecución va a suponer una pérdida de fluidez para el usuario, por lo que todo proceso costos debe ejecutarse en hilos separados, y AsyncTask facilita muchísimo la tarea.

Si tienes cualquier duda adicional mientras lo estés programando, pregunta.
Un saludo :)

zamudiofabian
08/05/12, 16:48:10
entendi perfecto, ya me pongo a leer sobre el AsyncTask.

Muchas gracias

Sopanda
08/05/12, 17:17:28
Estoy de acuerdo con Tompad28, lo mejor es hacer un hilo de ejecución paralelo que haga la faena y no bloquear la pantalla principal.

zamudio
09/05/12, 06:34:51
Luego de ller bastante y hasta entender como usar (no del todo bien)

logr que me funcionara el TextView suma los numero.....

EDITO: el error que tuve fue de noob como lo dije me olvide de pasar View al onClick me funciona perfecto :D dejo el código por las dudas Muchas gracias a todos

package com.clase.asincronica;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class ClaseasincronicaActivity extends Activity {

Secundario otro = new Secundario();
TextView tv1;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv1=(TextView)findViewById(R.id.tv);
otro.execute();
}

public void onClick(View view)
{
otro.cancel(true);
}


public class Secundario extends AsyncTask<Void, Integer, Void>
{
int contador;
@Override

protected void onPreExecute()
{
contador=0;
}
@Override
protected void onProgressUpdate(Integer... i)
{
tv1.setText(String.valueOf(contador));
}

@Override
protected Void doInBackground(Void... params) {
while (!isCancelled())
{
publishProgress(contador);
contador++;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

return null;
}
}

}