|
||
|
![]() |
![]() |
Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
![]() |
|
Herramientas |
#1
|
||||
|
||||
Para Timer en android
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 ![]() Un saludo. |
|
#3
|
||||
|
||||
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.
|
#5
|
||||
|
||||
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.
|
#6
|
||||
|
||||
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. Código:
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 ![]() Gracias y un saludo. |
![]() |
![]() |
||||||
|