2017-08-06 6 views
1

Je suis un étudiant qui essaie de créer une application pour mon mini-projet pour l'un de mes modules et j'essaie de créer une application qui saisit les données d'un serveur toutes les quelques secondes, donc mis à jour. J'ai essayé d'utiliser java timer et timerTask pour exécuter le code à plusieurs reprises, mais le programme ne s'exécute qu'une seule fois et le bouton get ne fonctionne pas comme prévu (supposons de saisir des données instantanément) après l'implémentation du timer. Android EmulatorTimer.schedule s'exécute une fois même avec période

public class MainActivity extends AppCompatActivity implements OnClickListener{ 

private Button speed; 
private TextView result; 
Timer timer; 
TimerTask timerTask; 
private TextView sSpeed; 
final StringBuilder builder = new StringBuilder(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    result = (TextView) findViewById(R.id.result); 
    sSpeed = (TextView) findViewById(R.id.sSpeed); 
    speed = (Button) findViewById(R.id.get_button); 
    speed.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View view) { 
      getWebsite(); 
     } 
    }); 
    View aboutButton = this.findViewById(R.id.about_button); 
    aboutButton.setOnClickListener(this); 
    View exitButton = this.findViewById(R.id.exit_button); 
    exitButton.setOnClickListener(this); 
} 

public void onClick(View v) { 
    switch (v.getId()){ 
     case R.id.get_button: 
      getWebsite(); 
      break; 
     case R.id.about_button: 
      Intent i = new Intent(this, About.class); 
      startActivity(i); 
      break; 
     case R.id.exit_button: 
      finish(); 
      break; 
    } 
} 

private void getWebsite(){ 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 


      try{ 
       Document doc = Jsoup.connect("http://10.0.2.2:8080/Start_Stop_buttons_UTF8.html").get(); 
       // Elements element = doc.getElementsByTag("p"); 
       Elements element = doc.select("p"); 
       //String title = doc.title(); 
       builder.append(title).append("\n"); 
       for (Element tag : element){ 
        builder.append("\n\n").append(tag.text()); 
       } 

      }catch(IOException e){ 
       //e.printStackTrace(); 
       builder.append("Error : ").append(e.getMessage()).append("\n"); 
      } 

      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        String a = builder.toString(); // parse data from html into new string 
        a = a.substring(a.indexOf(":")+1, a.indexOf("Control")).trim();//trim string content 
        String b = builder.toString(); 
        b = b.substring(11,b.indexOf(":")+1).trim(); 

        double speed = Double.parseDouble(a);//convert string into double 
        if (speed<1000) 
         Log.i("HTML text","too slow"); 
        else if((speed> 1500))Log.i("HTML text","too fast!"); 

        result.setText(a); 
        sSpeed.setText(b); 
       } 
      }); 
     } 

    }).start(); 

} 

protected void onResume() { 
    super.onResume(); 
    startTimer(); 
} 

public void startTimer(){ 
    timer = new Timer(); 
    timerTask = new TimerTask() { 
     @Override 
     public void run() { 
      getWebsite(); 

     } 
    }; 
    timer.schedule(timerTask,1500,3000); 
} 

public void stopTimer(){ 
    if(timer != null){ 
     timer.cancel(); 
     timer.purge(); 
    } 
} 

}

Suis-je mettre en œuvre la minuterie correctement pour exécuter getwebsite() à plusieurs reprises et en mesure d'obtenir une mise à jour instantanée lorsque get-bouton est cliqué comme il devrait avoir? Ou existe-t-il une meilleure façon d'implémenter ces fonctionnalités en utilisant une méthode différente?

Répondre

0

Vous n'appelez jamais la méthode startTimer dans votre ClickListener. Vous faites un appel au getWebsite. Changez votre appel au startTimer.

speed.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View view) { 
      startTimer(); 
     } 
    }); 

Vous pouvez également vérifier si la minuterie est déjà en cours d'exécution avant d'en démarrer une nouvelle. Pour ce faire, attribuez une valeur null à votre méthode stopTimer, par exemple.

public void stopTimer(){ 
    if(timer != null){ 
     timer.cancel(); 
     timer.purge(); 
     timer = null; 
    } 
} 

Et votre startTimer ressemblerait à ceci

public void startTimer(){ 
    if(timer != null) return; // don't start multiple timers 
    timer = new Timer(); 
    timerTask = new TimerTask() { 
     @Override 
     public void run() { 
      getWebsite(); 

     } 
    }; 
    timer.schedule(timerTask,1500,3000); 
} 
+0

Merci pour la réponse. Votre réponse pourrait s'avérer utile, mais je reçois toujours les mêmes erreurs: il n'est toujours pas mis à jour pour les changements dans les données affichées. J'ai essayé de modifier les données prévues pour être affichées sur le Web, mais cela ne s'affiche pas dans l'émulateur. Le problème réside-t-il dans le minuteur ou est-ce mes codes? –

+0

En outre, quelle est la raison pour laquelle le bouton "get" ne répond pas à mes codes? –