2016-11-25 7 views
0

За последнюю неделю, я использую Android Studio, чтобы написать код, который обеспечивает достижение следующих целей:Проблемы при использовании Android Studio, чтобы получить время поездки между двумя точками

  1. Ожидать пользователю быть в пределах определенного расстояние от начальной точки маршрута
  2. Однажды при запуске Точке начать таймер, который записывает данные GPS и текущее время
  3. Остановки таймер, когда конец путевого пересечена

на данный момент у меня есть начальная и конечная путевые точки жестко закодированы, но я, кажется, сталкиваюсь с ошибкой, которую я пытаюсь проследить с помощью сквозной функции на моей IDE, но не могу ее найти. Ниже приведен код, который я использую:

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; 
    } 

Когда я запускаю код, телефон я проверить это один будет работать, но она не будет реагировать, что заставляет меня полагать, что существует неудовлетворенный цикл, который я не рассмотрели.

Любые предложения были бы полезны, заблаговременно за консультацию!

ответ

1

Ваши циклы while засоряют выполнение ЦП, из-за чего он не отвечает. Вместо этого вы должны поместить свой код внутри потока и вызвать Thread.sleep(1000); внутри потока, таким образом цикл while приостанавливается на 1 секунду после каждого выполнения кода внутри него.

Что-то вроде этого:

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();