2011-03-28 20 views
7

Mi problema es similar a este, How to update a widget every minute, sin embargo, solo quiero actualizar TextView de la interfaz de usuario. Necesito acceso a la hora, por lo que desafortunadamente no puedo usar la vista de Reloj Digital.La mejor manera de actualizar TextView, cada minuto, en el minuto

he estado investigando y han encontrado maneras de actualizar cada minuto, pero no en el momento en lo que se sincronizan con el reloj del sistema (por lo que podrían ser de hasta 59 segundos fuera de sincronía!)

Las únicas maneras No puedo pensar en hacerlo son (a) ejecutar un controlador (o temporizador) cada segundo (que parece un poco una exageración si sólo desea actualizar cada minuto) Like this from the android.com resources

(b) Disponer de un servicio que se ejecuta en segundo plano . (No estoy interesado en esto como ya tengo cosas más importantes que se ejecutan en segundo plano)

(c) utilizar el Administrador de alarma (una vez más parece un exceso)

parece ser una cosa tan fácil de hacer, y sin embargo ...

Cualquier consejo apreció Mel

Respuesta

0

usted puede probar la configuración de una Timer para ejecutar un TimerTask que actualiza su TextView cada minuto (ver su método schedule).

+0

Gracias, esta idea funcionó. Obtuve la fecha actual, los segundos restados y los milliscounds, así que fue un minuto redondeado. Luego agregué un minuto completo como cuándo comenzar. Finalmente, configuré el temporizador para renovar cada minuto (60 000 milisegundos) – Mel

+1

Aquí hay un código si alguien está interesado. El código escrito por Steve Ody (http://steve.odyfamily.com/?p=12) fue muy útil. 'código' myTimer = new Timer(); GregorianCalendar calCreationDate = new GregorianCalendar(); int intMilli = calCreationDate.get (Calendar.MILLISECOND); int intSeconds = calCreationDate.get (Calendar.SECOND); calCreationDate.add (Calendar.MILLISECOND, (-1 * intMilli)); calCreationDate.add (Calendar.SECOND, -1 * intSeconds); calCreationDate.add (Calendar.MINUTE, 1); Fecha dateStartDate = calCreationDate.getTime(); 'código' – Mel

+0

Los temporizadores en Android funcionan, pero NO son la forma preferida. ¡Use controladores en lugar de temporizadores! – Zordid

0

has necesitado postDelayed()

+0

Gracias por su reproducción. A pesar de que el artículo en Android recomienda manejadores, ¡el artículo de Steve Ody me desanimó un poco! – Mel

38

La respuesta aceptada no responde específicamente a la cuestión. El OP solicita una forma de recibir algún tipo de evento a tiempo (en el minuto del reloj del sistema y 00 segundos).

El uso de un temporizador no es la manera correcta de hacerlo. No solo es excesivo, sino que debes recurrir a algunos trucos para hacerlo bien.

La forma correcta de hacer esto (es decir, actualizar un TextView que muestra el tiempo como HH:. Mm) es el uso de BroadcastReceiver así:

BroadcastReceiver _broadcastReceiver; 
private final SimpleDateFormat _sdfWatchTime = new SimpleDateFormat("HH:mm"); 
private TextView _tvTime; 

@Override 
public void onStart() { 
    super.onStart(); 
    _broadcastReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context ctx, Intent intent) { 
       if (intent.getAction().compareTo(Intent.ACTION_TIME_TICK) == 0) 
        _tvTime.setText(_sdfWatchTime.format(new Date())); 
      } 
     }; 

    registerReceiver(_broadcastReceiver, new IntentFilter(Intent.ACTION_TIME_TICK)); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    if (_broadcastReceiver != null) 
     unregisterReceiver(_broadcastReceiver); 
} 

El sistema enviará este evento de difusión en el comienzo exacto de cada minuto basado en el reloj del sistema. Sin embargo, no olvide inicializar su TextView de antemano (a la hora actual del sistema) ya que es probable que muestre su IU en el medio de un minuto y TextView no se actualizará hasta que ocurra el siguiente minuto.

+0

¡tu código funciona muy bien! Gracias ... ¿Cómo actualizar el tiempo por segundo? – Rash

+1

Lamentablemente, ACTION_TIME_TICK se soluciona minuto a minuto. Si alguna vez necesitaba un TextView para mostrar la hora actual con segundos, creo que usaría un TextView por separado para los segundos y lo manejaría con un simple temporizador (resintonizado cada minuto por el BroadCastReceiver para evitar cualquier sesgo de larga ejecución). El punto para no usar un temporizador es que, básicamente, desea ver los cambios de minutos EN EL MINUTO del tiempo real. Los segundos generalmente no son un problema si están un poco apagados, pero resintonizar cada minuto debería ser el truco para siempre. – Alex

+0

Chicos está funcionando perfectamente, primero he establecido la fecha en onCreate, y luego en cada minuto se actualiza desde broadcastReciever. –

-1

Esto es lo que he utilizado:

int secsUntilOnTheMinute=60-Calendar.getInstance().get(Calendar.SECOND); 

timer.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     updateSendTimesHandler.sendEmptyMessage(0); 
    } 
}, secsUntilOnTheMinute*1000, 60000); 
+0

Agregue una explicación en lugar de simplemente publicar el código. –

+0

No debe usar TimerTask ya que no es confiable. Ver más en: https://guides.codepath.com/android/Repeating-Periodic-Tasks – jpact

Cuestiones relacionadas