2016-12-31 1 views
1

Ce code doit s'exécuter indéfiniment. Cependant, il s'exécute avec succès une fois et plus jamais. Aucune exception n'est lancée donc je ne peux pas comprendre ce que j'ai fait de mal. Cependant, lorsque nextExpression n'est pas appelée, elle s'exécute indéfiniment.Le service de l'exécuteur programmé ne s'exécute qu'une seule fois, aucune exception n'est levée

Voici le code:

onCreate() { 

    Runnable Runnable = new Runnable() { 
     public void run() { 
      System.out.println("Hello world"); 
      nextExpression(); 
     } 
    }; 

    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); 
    executor.scheduleAtFixedRate(Runnable, 0, 3, TimeUnit.SECONDS); 
} 


int i = 0; 

public void nextExpression() { 
    i++; 
    expression.setText("" + i); 
} 
+1

type 'de expression' et qu'est-ce que la mise en œuvre de' setText' contiennent? –

+0

le type d'expression est un textView – james

Répondre

3

I a été testée et il fonctionne comme il se doit, si vous souhaitez mettre à jour un composant d'interface utilisateur, vous devez le faire avec le fil principal.

Pour mettre à jour le textView du fil principal, vous pouvez le faire comme ceci:

public void nextExpression() { 
    i++; 
    runOnUiThread(new Runnable() { 
     public void run() { 
      expression.setText("" + i); 
     } 
    }); 
} 
+0

Quelle partie dois-je modifier pour que cela fonctionne? – james

3

Votre mise à jour de l'interface utilisateur ne se produit pas sur thread d'interface utilisateur, mais le fil de threadpool, cela ne fonctionnera pas. Pour relayer mise à jour thread d'interface utilisateur modifier

expression.setText("" + i); 

Ce qui est

expression.post(new Runnable() { 
      @Override 
      public void run() { 
       expression.setText("" + i); 
      } 
     });