Perfecto, muchas gracias Gus
, he hecho pruebas y funciona de maravilla, pero hasta cierto punto.
La primera prueba la hice de la siguiente manera:
public class Prueba extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_1);
timer.schedule(new classProcess(),1000, 1000);
}
public void run() {
Log.e("HILO CORRIENDO", "HILO CORRIENDO");
}
}
}
Pues el código de arriba funciona perfecto, he utilizado un clase interna(sabia que alguna día me iba a ser útil) que extiende de TimerTask y sobreescribo el método run y pongo que se mostrara un Log en la consola. Todo esto se ejecutara desde el Timer, que lo cree en el método onCreate, le paso como parámetro una instancia de la clase interna "classProcess", iniciara en 1 segundo y se repetirá cada 5 segundos, esto lo hace de lujo.
Pero cuando quiero, modificar el valor de un TextView cada cierto tiempo, en este caso cada segundo, me arroja un error en el emulador. El código lo he hecho de 2 formas, pero ninguna me anda.
Antes de mostrar el código, quería comentarles lo que quiero hacer. Lo que quiero lograr es que un textView cambie su valor cada segundo, osea funciona como un temporizador. Por defecto le pongo un texto que dice 30 segundos, y bueno con la ayuda de Timer quiero hacer que el TextView vaya bajando cada segundo hasta llegar a 0 y ahí detenerse.
Esta es la primera forma, he puesto un par de comentarios en el código para que se entienda más el mismo:
public class Prueba extends ActionBarActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_1);
tv = (TextView)findViewById(R.id.tvTemporizador);
timer.schedule(new classProcess(),1000, 1000);
}
public void run() {
int bajar1Segundo
= Integer.
parseInt(tv.
getText().
toString())-1;//Obtengo el valor y lo bajo 1, por ejemplo, si es 30 ahora sera 29 tv.
setText(String.
valueOf(bajar1Segundo
));//Cambio el valor del TextView
if(bajar1Segundo == 0) {
timer.cancel();//No se si este método parara el Timer, No llegue a comprobar, ya que no llega a hasta este punto, ya que apenas inicia el programa se traba al querer cambiar los valores de los TextView
Toast.makeText(getApplicationContext(), "El tiempo se ha terminado", Toast.LENGTH_LONG);
}
}
}
}
En el código de arriba, creo que el error estaba en que: desde la clase interna quería acceder a las variables de clase que son privadas, de la clase principal, ustedes me dirán, ¿Por que no te diste cuenta de esto antes? pues es la primera vez que lo hago así, aparte el IDE no me arrojaba error, no me marcaba con lineas roja ni nada, y es por eso que he intentado también de esta forma:
public class Prueba extends ActionBarActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_1);
tv = (TextView)findViewById(R.id.tvTemporizador);
timer.schedule(new ClassProcess(this.tv),1000, 1000);
}
private TextView tv;
public classProcess(TextView tv) {
this.tv = tv;
}
public void run() {
int bajar1Segundo
= Integer.
parseInt(tv.
getText().
toString())-1;//Obtengo el valor y lo bajo 1, por ejemplo, si es 30 ahora sera 29 tv.
setText(String.
valueOf(bajar1Segundo
));//Cambio el valor del TextView
if(bajar1Segundo == 0) {
Toast.makeText(getApplicationContext(), "El tiempo se ha terminado", Toast.LENGTH_LONG);
}
}
}
}
Pues la diferencia entre el código que esta arriba y el que esta arriba de este de arriba(ya saben xD), es que la clase interna recibe parámetros en su constructor, recibe un TextView. Entonces en vez en vez de interactuar directamente con el TextView de la clase principal, interactuo con el TextView que recibo por parámetro de la clase principal, pero también me da error, y no se que puede ser.
Si no entienden algo, díganmelo.
Salu2