Ver la Versión Completa : [ CONSULTA ] Para Timer en android
alexisdance
29/12/13, 17:34:56
Hola buenas.
Estoy desarrollando mi primera app en Android (controlo Java) y en ella tengo un Timer que es ejecutado cada 1 milisegundo (es un cronometro).
Con un togglebutton arranco el cronometro y lo paro. Al pararlo utilizo el método cancel() y purge() y debo comprobar el valor que tiene en ese momento el campo que voy modificando en el timer.
El problema que tengo es que al hacer timer.cancel() si no está la task en ejecución perfecto, el timer para y hago las comprobaciones, pero si el task está en ejecución, se hacen la comprobaciones mientras se ejecuta la task del timer y, cuando para, el timer ya ha pasado a un milisegundo mas, dando por buenas las comprobaciones, pero en realidad no lo son.
Espero haberme explicado bien, a ver si podéis ayudarme con el problemilla :nav1:
Un saludo.
alexisdance
02/01/14, 20:15:18
Le hago un UP que estoy enganchado con el problema :( A ver si alguien puede echarme una mano.
Gracias :-)
kriogeN
02/01/14, 22:21:13
Tienes un problema de concurrencia, prueba ejecutando las comprobaciones y el task dentro de un synchronized sobre el mismo objeto. De esa forma las comprobaciones se ejecutarán sólo cuando el task haya terminado.
alexisdance
03/01/14, 13:43:24
Ya habia probado con synchronized y nada. He vuelto a probar en diferentes sitios y con otros hilos y tampoco :cry:
kriogeN
03/01/14, 16:15:15
Usar el synchronized no basta, sólo te asegura que no se ejecutará un bloque sin que el otro haya terminado primero. También tienes que comprobar en el timer que ya se han ejecutado las comprobaciones, y en ese caso no incrementar el contador.
alexisdance
03/01/14, 16:53:15
Se que tengo el codigo hecho una basura, pido disculpas por ello, pero no consigo que solo me de por bueno cuando el timer está en "00". A veces me da por bueno el timer en "00", a veces no y lo mismo pasa con "01".
Lo que busco es que con "00" y solo con "00" me lo de por bueno que es lo que no consigo.
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.app.Activity;
import android.text.format.DateFormat;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.TextView;
import android.widget.ToggleButton;
public class MainActivity extends Activity implements OnClickListener {
ToggleButton boton;
String equipo = "local";
TextView local;
TextView visitante;
TextView golesLocal;
TextView golesVisitante;
TextView textoms;
TextView textoss;
TextView textomm;
int n;
int p;
long milisegundos = 0;
long segundos = 0;
long minutos = 0;
Timer milisec;
Timer sec;
Timer min;
TimerTask task;
Object sync = new Object();
boolean comprobado = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
boton = (ToggleButton)findViewById(R.id.toggleButton1);
//chrono = (Chronometer)findViewById(R.id.chronometer1);
textoms = (TextView)findViewById(R.id.textView1);
textoss = (TextView)findViewById(R.id.textView2);
golesLocal = (TextView)findViewById(R.id.textView5);
golesVisitante = (TextView)findViewById(R.id.textView6);
boton.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View arg0) {
if(boton.isChecked()) {
milisegundos();
}
else {
comprobado = true;
/*
milisec.cancel();
task.cancel();
synchronized(sync) {
if(textoms.getText().toString().equals("00")) {
comprobado = true;
comprobar();
comprobado = false;
}
}
*/
//actualizarEquipo();
}
/*
switch(arg0.getId()) {
case R.id.button1:
//arg0.getContentDescription()
arg0.setContentDescription("Cambiado");
milisegundos();
break;
case R.id.button2:
//time = chrono.getBase() - SystemClock.elapsedRealtime();
//chrono.stop();
milisec.cancel();
break;
}
*/
}
private void actualizarEquipo() {
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
if(equipo.equals("local")) {
equipo = "visitante";
}
else {
equipo = "local";
}
}
});
}
private void comprobar() {
//if(textoms.getText().toString().equals("00")) {
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
if(equipo.equals("local")) {
int goles = Integer.parseInt(golesLocal.getText().toString());
goles++;
golesLocal.setText("" + goles);
}
else {
int goles = Integer.parseInt(golesVisitante.getText().toString ());
goles++;
golesVisitante.setText("" + goles);
}
}
});
//}
}
private void actualizarSegundos() {
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
p = Integer.parseInt(textoss.getText().toString());
p++;
if(p < 10) {
textoss.setText("0" + p);
}
else {
textoss.setText("" + p);
}
}
});
}
private void milisegundos() {
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
milisec = new Timer();
task = new TimerTask() {
@Override
public void run() {
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
synchronized(sync) {
if(comprobado == false) {
n = Integer.parseInt(textoms.getText().toString());
n++;
if(n < 10) {
textoms.setText("0" + n);
}
else if(n < 100) {
textoms.setText("" + n);
}
else {
textoms.setText("00");
actualizarSegundos();
}
}
else {
milisec.cancel();
task.cancel();
if(textoms.getText().toString().equals("00")) {
comprobar();
}
comprobado = false;
}
}
}
});
};
};
milisec.schedule(task, 0, 10
);
}
});
thread.start();
}
}
Si alguien tiene las ganas de intentar entender el codigo lo agradeceria mucho X-D
Gracias y un saludo.
vBulletin® v3.8.1, Copyright ©2000-2025, Jelsoft Enterprises Ltd.