[Ayuda]Timer en Android

Iniciado por PabloPbl, 12 Abril 2015, 05:41 AM

0 Miembros y 1 Visitante están viendo este tema.

PabloPbl

La clase interna me quedo de esta forma:

Código (java) [Seleccionar]
class TimerTask2 extends java.util.TimerTask{
        public void run() {
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //Obtengo el valor y lo bajo 1, por ejemplo, si es 30 ahora sera 29
                    int bajar1Segundo = Integer.parseInt(tv.getText().toString())-1;
                    tv.setText(String.valueOf(bajar1Segundo)); //Cambio el valor del TextView
                    if(bajar1Segundo == 0) {
                        Toast.makeText(getApplicationContext(), "El tiempo se ha terminado", Toast.LENGTH_LONG);
                    };
                }
            });
        }
    }

PabloPbl

#11
Gus eres grande, muchas gracias por toda la ayuda  ;D.

Puse el mismo código, pero sin poner el método getActivity() y funciona de maravilla la App, osea el code me quedo algo así:

Código (java) [Seleccionar]
public void run() {
           runOnUiThread(new Runnable() {
               @Override
               public void run() {
                   //Obtengo el valor y lo bajo 1, por ejemplo, si es 30 ahora sera 29
                   int bajar1Segundo = Integer.parseInt(tv.getText().toString())-1;
                   tv.setText(String.valueOf(bajar1Segundo)); //Cambio el valor del TextView
                   if(bajar1Segundo == 0) {
                       Toast.makeText(getApplicationContext(), "El tiempo se ha terminado", Toast.LENGTH_LONG);
                   };
               }
           });
       }


Saludos crack!!!

Usuario Invitado

getActivity(), te devuelve la actividad. También bastaría con Prueba.this. Intenta hacerlo con un callback en lugar de una clase:

Código (java) [Seleccionar]

public class Prueba extends ActionBarActivity {

   private TextView tv;
   private Timer timer;
   private TimerTask timerTask;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_1);
       tv = (TextView)findViewById(R.id.tvTemporizador);
   }
   public void startTimer() {
       timer = new Timer();
       initializeTimerTask();
       timer.schedule(new TimerTask,1000, 1000);
   }
   private void initializeTimerTask() {
       timerTask = new TimerTask() {
           @Override
           public void run() {
               getActivity().runOnUiThread(new Runnable() {
               @Override
               public void run() {
                   //Obtengo el valor y lo bajo 1, por ejemplo, si es 30 ahora sera 29
                   int bajar1Segundo = Integer.parseInt(tv.getText().toString())-1;
                   tv.setText(String.valueOf(bajar1Segundo)); //Cambio el valor del TextView
                   if(bajar1Segundo == 0) {
                       Toast.makeText(getApplicationContext(), "El tiempo se ha terminado", Toast.LENGTH_LONG);
                   };
               }
           });
   }
   public void cancelTimer() {
       if (timer != null) {
           timer.cancel();
           timer = null;
       }
   }
}



Saludos.


PD: Ya vi que lo solucionaste xD.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

PabloPbl

#13
Call back? nunca había oído de eso. He mirado el código que me haz pasado y hay cosas que nunca había visto, por lo que veo cuando tu haces:
Código (java) [Seleccionar]
timer.schedule(new TimerTask,1000, 1000);
Como primer parámetro le estas pasando un nuevo objeto, pero como se yo que se va a ejecutar este código:
Código (java) [Seleccionar]

private void initializeTimerTask() {
       timerTask = new TimerTask() {
           @Override
           public void run() {
               getActivity().runOnUiThread(new Runnable() {
               @Override
               public void run() {
                   //Obtengo el valor y lo bajo 1, por ejemplo, si es 30 ahora sera 29
                   int bajar1Segundo = Integer.parseInt(tv.getText().toString())-1;
                   tv.setText(String.valueOf(bajar1Segundo)); //Cambio el valor del TextView
                   if(bajar1Segundo == 0) {
                       Toast.makeText(getApplicationContext(), "El tiempo se ha terminado", Toast.LENGTH_LONG);
                   };
               }
           });
   }


Jajaja xDDD, justo me acabo de dar cuenta de algo, capaz que lo que haz querido hacer, es esto:
Código (java) [Seleccionar]
timer.schedule(timerTask,1000, 1000);
En vez de pasarle un nuevo objeto, le pasamos el que creamos anteriormente.

Creo que es mas fácil hacerlo así no?

PD: Acabo de leer el principio de este mensaje y me mato xDDD

Usuario Invitado

Sí, debes pasarle el objeto que está como propiedad y que se ha inicializado en el método initializeTimerTask(), lo que pasa es que en la edición olvidé cambiar eso xD.


Saludos.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

PabloPbl

Ahora si tiene mas sentido jaja.

Gracias y un Saludo!!