|
||
|
|
|
|||||||
| 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 y pausar un progressBar que avanza con un Hilo.
Buenas.
No se si esto esta respondido ya. La pregunta es: Como se puede parar y pausar un progressbar cuyo avance se hace a traves de un hilo con un boton? El metodo stop(); parece ser que no es aconsejable usarlo y esta depreciado y hay que evitarlo. Por lo que leo los tiros van por usar wait() and notify() . Código:
public void comienzoJuego(){
hilo = new HiloComienzoJuego();
hilo.start();
}
class HiloComienzoJuego extends Thread {
@Override
public void run() {
while(progressTime < totalTime ){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
progressbar.incrementProgressBy(1);
progressTime++;
/*aqui vendria mas codigo que no no viene al caso *
Código:
public void botonPause (View v){
if(pulsar==0){
botonPausar.setImageResource(R.drawable.boton_reanudar);
pulsar=1;
setGamePaused(true);
}else{
botonPausar.setImageResource(R.drawable.boton_pause);
pulsar=0;
setGamePaused(false);
}
}
public void setGamePaused(boolean pausado){
this.gamePaused= pausado;
}
public boolean getGamePaused(){
return gamePaused;
}
Tambien he probado con hilo.interrupt(); y tampoco. Alguna idea??? |
|
|
|
#2
|
||||
|
||||
|
Es normal que se pare ejecutando esto:
while(progressTime < totalTime && !getGamePaused()) Ya que al no cumplirse la segunda condición no entra en el While y el hilo termina, divide el código: while(progressTime < totalTime) { if (!getGamePaused()) { //AQUÍ TODO EL RESTO DEL CÓDIGO De esta forma siempre estará dentro del While, pero progressTime sólo se incrementará si se cumple el if. Por último 2 cosas: 1) No es recomendable actualizar una vista desde un hilo (salvo que sea un SurfaceView, que están pensadas para tal efecto). Así que lo mejor es que cuando accedas a la progressBar lo hagas con un Handler. O mejor aún, que modifiques el código para usar un AsyncTask y lo hagas en el "onProgressUpdate". 2) Aunque no es muy importante y es rariiiisimo que te vaya a fallar, es recomendable que el acceso a gamePaused sea "synchronized", ya que podría coincidir una lectura y escritura a la vez al estar en hilos distintos. Pero como ya te digo es muuuy raro que ocurra. Esto también lo solucionarías con el AsyncTask, poniendo la comprobación de gamePaused también en el "onProgressUpdate". |
|
#3
|
||||
|
||||
|
Hola,
Efectivamente funciona como dices con el if despues del while , la putada es que tengo un contador de segundos puesto arriba con un textView que me actualiza el progressbar tal que asi: Código:
while(progressTime < totalTime ){
if(!getGamePaused()){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
progressbar.incrementProgressBy(1);
progressTime++;
handler.post(new Runnable(){
@Override
public void run() {
if(!getGameOver()) //si el juego no esta terminado ponemos los segundos que quedan, pero cuando termina no.
//textTiempo.setText(String.valueOf(totalTime-progressTime)+" seg");
textTiempo.setText(String.valueOf( (totalTime-progressTime)<60
?totalTime-progressTime
:((totalTime-progressTime)/60)+":"+String.valueOf(
(totalTime-progressTime)%60>9
?(totalTime-progressTime)%60
:"0"+(totalTime-progressTime)%60) )+" sec");
}
});
Respecto a los handlers esta claro, de hecho tengo el código lleno de handlers para actualizar vistas, pero dices que mejor usar un AsyncTask. ¿Es mas efeciente? lo digo porque cambiar todo por asincTask seria una movida con lo sencillo que es el uso de un handler. Un saludo. |
|
#4
|
||||
|
||||
|
Creo que puede solucionar tu desfase de 1 segundo poniendo detrás del Thread.sleep(1000) esto:
if(getGamePaused()) continue; Aunque lo volverías a tener al reanudar, ya que volvería a contar el segundo desde el principio, independientemente de que lo parases en el X,01 o en el X,99. Pero al menos la ProgressBar y el TextView irían sincronizados. |
|
#5
|
||||
|
||||
|
hola, pues si , se para al instante y luego al reanudar pilla el desfase, pero lo prefiero de esta forma ya que se sincroniza con el textview.
REspecto a los handlers, implementarias al tener tantas vistas AsyncTask o es igual de eficiente para estos casos el uso de handler? |
![]() |
Estás aquí
|
||||||
|
||||||