2016-11-25 1 views
0

Pour la dernière semaine, j'utilise Android Studio pour écrire du code qui permet d'atteindre les objectifs suivants:Problèmes d'utilisation en studio Android pour obtenir le temps de Voyage entre deux points

  1. Attendez que l'utilisateur soit dans un certain la distance du point de cheminement de départ
  2. une fois au point de passage de début, commencer un minuteur qui enregistre les données GPS et l'heure actuelle
  3. Arrête la minuterie lorsque le point de passage de fin est traversée

à l'heure actuelle, je les waypoints de début et de fin sont codés en dur mais il semble que je rencontre une erreur que j'ai essayé de tracer avec la fonction pas à pas sur mon IDE mais que je n'arrive pas à trouver. Voici le code que j'utilise:

void StartTimer (View view){ 
     //Location l = null; 
     boolean hasLoc = false; //are we at the start? 
     float speed = 0; 
     float topSpeed = 0; 


     while(hasLoc == false && cancel == false){ 
      float d = l.distanceTo(t); 

      if(d < 2.0) 
       hasLoc = true; 

      //if(!l.equals(lm.getLastKnownLocation(""))) 
      String msg = "Latitude: " + l.getLatitude() + "\nLongitude: "+ l.getLongitude(); 
      Toast.makeText(getBaseContext(), msg, Toast.LENGTH_LONG).show(); 
     } 

     hasLoc = false; 

     Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      public void run() { 
       // Actions to do after 10 seconds 
       buzzer(); 
      } 
     }, 10000); 

     while(l.distanceTo(tf) > 2.0 && cancel == false){ 
      float cSpeed = l.getSpeed(); 

      if(cSpeed>topSpeed) 
       topSpeed = cSpeed; 

      String msg = "Current Speed: "+cSpeed+"Top Speed: "+topSpeed; 
      Toast.makeText(getBaseContext(), msg, Toast.LENGTH_LONG).show(); 
     } 

     cancel = false; 
    } 

Quand je lance le code, le téléphone, je le tester on l'exécuter, mais il ne répondra pas, ce qui me conduit à croire qu'il est une boucle non satisfaite que je n'ont pas considéré.

Toutes les suggestions seraient utiles, merci d'avance pour des conseils!

Répondre

1

Vos boucles while bloquent l'exécution de la CPU, ce qui provoque l'absence de réponse. Au lieu de cela, vous devez placer votre code dans un thread et appeler Thread.sleep(1000); à l'intérieur du thread, de cette façon la boucle while est mise en pause pendant 1 seconde après chaque exécution du code à l'intérieur.

Quelque chose comme ceci:

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

      while (hasLoc == false && cancel == false) { 
       float d = l.distanceTo(t); 
       if (d < 2.0) 
        hasLoc = true; 
       String msg = "Latitude: " + l.getLatitude() + "\nLongitude: " + l.getLongitude(); 

       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         Toast.makeText(getBaseContext(), msg, Toast.LENGTH_LONG).show(); 
        } 
       }); 
      } 

      hasLoc = false; 

      new Handler().postDelayed(new Runnable() { 
       public void run() { 
        // Actions to do after 10 seconds 
        buzzer(); 
       } 
      }, 10000); 

      while (l.distanceTo(tf) > 2.0 && cancel == false) { 
       float cSpeed = l.getSpeed(); 

       if (cSpeed > topSpeed) 
        topSpeed = cSpeed; 

       String msg = "Current Speed: " + cSpeed + "Top Speed: " + topSpeed; 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         Toast.makeText(getBaseContext(), msg, Toast.LENGTH_LONG).show(); 
        } 
       }); 
      } 

      cancel = false; 

     } 
    }).start();