frustración publicación ....android CountDownTimer - last onTick no llamado - ¿qué solución limpia usar?
Acabo de tropezar con el problema "CountDownTimer - el último en el truco no llamado" que muchos han informado aquí.
demostración simple que muestra el problema
package com.example.gosh;
import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.util.Log;
public class CountDownTimerSucksActivity extends Activity {
int iDontWantThis = 0; // choose 100 and it works yet ...
private static final String TAG = "CountDownTimerSucksActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new MyCountDownTimer(10000 + iDontWantThis , 1000).start();
}
class MyCountDownTimer extends CountDownTimer {
long startSec;
public MyCountDownTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
// TODO Auto-generated constructor stub
startSec = System.currentTimeMillis() ;
}
@Override
public void onFinish() {
// TODO Auto-generated method stub
Log.e(TAG, " onFinish (" + getSeconds() + ")");
}
@Override
public void onTick(long millisUntilFinished) {
// TODO Auto-generated method stub
Log.e(TAG, millisUntilFinished + " millisUntilFinished" + " (" + getSeconds() + ")");
}
protected long getSeconds() {
return (((System.currentTimeMillis() - startSec)/1000) % 60);
}
}
}
La salida Logcat de una prueba de funcionamiento ...
Como se puede ver la última llamada onTick está sucediendo con 1963ms millisUntilFinished, a continuación, la próxima llamada se iniciará casi 2 segundos después. Sin duda, un comportamiento con errores. Encontré muchas publicaciones sobre esta aún ninguna solución limpia todavía. Uno que incluí en el código fuente, si configura el campo iDontWantThis en 100, funciona.
No me preocupo por las soluciones en campos menores, sin embargo, esto parece ser una funcionalidad básica que no puedo entender que todavía no se haya solucionado. ¿Qué están haciendo las personas para tener una solución limpia para esto?
Muchas gracias
martin
ACTUALIZACIÓN:
Una modificación muy útil de la countDownTimer por Sam que no surpresses la última señal debido a un retraso ms interna y también evita la acumulación de ms retraso con cada tic en el tiempo se puede encontrar here
Muchas gracias, bastante nuevo en Android y que no he hecho el paso para mirar realmente en su código fuente en los casos por el estilo. Muchas gracias por señalarme ese paso. Implementaré mi propio CountDownTimer como se sugiere, que siempre llama a Tick si millisUntilFinished> 0 y puedo verificar fácilmente si el milímetro restante permite lo que quiero hacer (en realidad solo necesito el temporizador de cuenta regresiva que muestra 6,5,4,3,2 , 1,0) – dorjeduck
solo para completar, eliminando lo siguiente si el bloque realiza el trabajo para que se llame aTick cuando haya millones restantes ------------------- ---------------------------------------------} else if (millisLeft)
dorjeduck