2012-01-10 3 views
1

J'ai deux activités, l'une est principale et j'ai une autre activité appelée Test etandroid: comment ajouter du texte à TextView dans une autre activité toutes les 2 secondes

dans l'activité principale j'ai un bouton lorsque je clique sur ce bouton je vais à l'activité test

dans l'activité de test, je veux l'application pour ajouter automatiquement un texte à l'textview qu'il a toutes les 10 secondes

ce texte peut être par exemple « test » si tous les 10 secondes "test" sera ajouté mais, quand je quitte l'activité et aller à l'activité principale, ce processus continuera à se produire donc si par exemple je passe 20 secondes sur l'activité principale, puis revenez à l'activité de test, je vais voir deux autres chaînes "test" dans le textview ..

I essayé de faire cela avec TimerTask et avait aucun succès

c'est le code de l'activité de test, l'activité principale que je viens sur le bouton qui me montre l'autre activité

public class test2 extends Activity { 
    /** Called when the activity is first created. */ 

    private TimerTask task; 
    private Handler handler; 
    private TextView tv; 
    private Timer t; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.text1); 

     t = new Timer(); 
     task = new TimerTask() { 
      public void run() { 
       handler.post(new Runnable() { 
        public void run() { 
         TextView tv = (TextView) findViewById(R.id.tv1); 
         tv.append("test"); 

        } 
       }); 

      } 
     }; 
     t.schedule(task, 2000); 
    } 
} 

lorsque je clique sur le bouton de l'activité principale afin d'aller à l'activité de test, je reçois l'erreur suivante:

   FATAL EXCEPTION: Timer-0 
       java.lang.NullPointerException 

merci à l'avance

+0

Est-ce que '' handler'' est initialisé quelque part que vous n'avez pas vu dans l'extrait de code que vous avez fourni? – harism

+0

harisme, vous avez raison, mais maintenant il montre juste la première chaîne "test" et rien d'autre ... – js2

+0

Timer.scheduleAtFixedRate (..) est peut-être ce que vous cherchez si vous voulez le faire répéter sur fixe intervalle. N'oubliez pas d'annuler son exécution avant que Activity soit détruit, disons, sur Activity.onDestroy(). Mais comme John l'a souligné, je ne suis pas du tout sûr si c'est une approche que vous recherchez. – harism

Répondre

1

Si vous voulez mettre en œuvre un moyen de mettre à jour la vue de l'arrière-plan, je recommande de passer à utiliser un lieu Service, avec une minuterie peut envoyer périodiquement Diffusions, dont le principal activité peut accéder avec un BroadcastReceiver. Le TimerTask peut être implémenté au démarrage du service d'arrière-plan.

Si vous souhaitez mettre immédiatement à jour la classe de test lors de son chargement, vous pouvez également implémenter une "mise à jour" BroadcastReceiver sur le service, dont la fonction serait d'envoyer une autre diffusion avec la valeur mise à jour. De cette façon, vous n'avez pas besoin de vous inquiéter que votre activité Test soit interrompue pendant que vous passez d'une activité à l'autre (si c'est ce que vous voulez).

EDIT:

Voici un très bon tutoriel qui devrait avoir tout ce dont vous avez besoin:

http://www.vogella.de/articles/AndroidServices/article.html

+0

Salut John merci pour la réponse, avez-vous un exemple qui fait quelque chose de similaire? – js2

+0

Salut js2, j'ai mis à jour ma réponse avec un tutoriel qui correspond assez bien à votre message. –

+0

+1 Le service est l'approche la plus raisonnable dans ce cas IMO. – yorkw

0

sans le savoir l'application se bloque (c.-à-la de ligne de code où l'exception nullPointerException est lancée) toutes les réponses ne seront pas très précises.

Voici ce que je pense à votre problème:

vous appelez findViewById(R.id.tv1). cela renvoie la vue correcte si et seulement si votre activité est active ET votre mise en page fournit une vue texte avec l'ID tv1. Je suppose que votre fichier de mise en page XML est correct. Je pense qu'il peut faire quelque chose que vous appelez cette méthode sur un minuteur qui n'a rien à faire avec votre application. essayez avec getApplication().findViewById(R.id.tv1). Cela garantira que findViewById recherche dans la bonne activité où vous définissez votre mise en page XML.Une activité a son propre cycle de vie. Voir here. Ceci causera plus tard des problèmes puisque votre activité pourrait être tuée et le processus de mise à jour échouera. Comme l'a souligné John, Service ou AlarmManager est la chose que vous devriez utiliser. Assurez-vous toujours que vous ne réveillez pas le CPU trop souvent car cela entraînerait des pertes de batterie.

Questions connexes