2012-12-09 3 views
2

J'essaie de créer une application Android qui affiche l'heure actuelle. Je veux mettre à jour mon activité avec le minuteur, mais le TextView ne se met pas à jour, donc une seule fois est toujours à l'écran. Voici mon code:Impossible de mettre à jour textView avec Timer dans mon application Android

package com.example.androidtemp; 

import java.sql.Date; 
import java.text.SimpleDateFormat; 
import java.util.Timer; 
import java.util.TimerTask; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 
import com.example.androidtemp.R; 

public class ActivityTime extends Activity 
{ 
    SimpleDateFormat sdf; 
    String time; 
    TextView tvTime; 
    String TAG = "States"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_activity_time); 

     sdf = new SimpleDateFormat("HH:mm:ss"); 
     time = sdf.format(new Date(System.currentTimeMillis())); 

     tvTime = (TextView) findViewById(R.id.tvTime); 

     Timer timer = new Timer(); 
     TimerTask task = new TimerTask() 
     { 
      @Override 
      public void run() 
      { 
       // TODO Auto-generated method stub 
       timerMethod(); 
      } 
     }; 

     try 
     { 
      timer.schedule(task, 0, 1000); 
     } 
     catch (IllegalStateException e) 
     { 
      // TODO: handle exception 
      e.printStackTrace(); 
      Log.e(TAG, "The Timer has been canceled, or if the task has been scheduled or canceled."); 
     } 
    } 

    protected void timerMethod() 
    { 
     // TODO Auto-generated method stub 
     this.runOnUiThread(changeTime); 
    } 

    private final Runnable changeTime = new Runnable() 
    { 
     public void run() 
     { 
      // TODO Auto-generated method stub 
      //Log.d(TAG, "Changing time."); 
      sdf.format(new Date(System.currentTimeMillis())); 
      tvTime.setText(time); 
     } 
    }; 
} 

Quelqu'un at-il une solution à ce problème?

Répondre

0

Je vous recommande d'utiliser DigitalClock ou TextClock (vous pouvez utiliser 'include' dans la mise en page xml et layout/layout-v17 pour utiliser un composant différent selon la version du système d'exploitation) si vous voulez juste afficher l'heure.

Si vous voulez avoir plus de contrôle, je vous recommande d'utiliser un gestionnaire ou un ExecutorService au lieu d'un temporisateur. Java Timer vs ExecutorService?

Si vous souhaitez fixer votre code tel qu'il est, il suffit de modifier la valeur du « temps » variable;)

+0

Merci beaucoup! Je n'ai juste pas vu que je ne modifie pas la valeur 'temps' :) –

0

Utilisez un gestionnaire car il peut accéder aux vues de votre application. Les vues de votre application appartiennent déjà au thread principal, donc la création d'un autre thread pour y accéder ne fonctionne généralement pas. Si je ne me trompe pas, les gestionnaires utilisent des messages pour communiquer avec le thread principal et ses composants. Utilisez ce où vous avez votre définition de fil à la place:

Handler handler = new Handler(); 
handler.removeCallbacks(runnable); 
handler.postDelayed(runnable, 1000); 

et l'ajouter à votre définition runnable

handler.postDelayed(runnable, 1000); 

Cette dernière instruction supprime toute instance d'exécution en attente runnable lorsqu'un nouveau sur est ajouté. Un peu comme effacer une file d'attente.

Questions connexes