Search code examples
javaandroidgpslocationlistener

Issues using android studio to get time of travel between two points


For the last week, I have been using Android Studio to write code that achieves the following goals:

  1. Wait for the user to be within a certain distance of the start waypoint
  2. Once at start waypoint, begin a timer that logs gps data and current time
  3. Stops timer when the end waypoint is crossed

At the moment, I have the start and end waypoints hard coded but I seem to run into an error that I have been trying to trace with the step through function on my IDE but can't seem to find it. Below is the code I have been using:

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

When I run the code, the phone I test it one will run it but it won't respond, which leads me to believe there is an unsatisfied loop that I have not considered.

Any suggestions would be helpful, thank you in advance for advice!


Solution

  • Your while loops are clogging up the CPU's execution which is what is causing it to not respond. Instead you should place your code inside a thread and call Thread.sleep(1000); inside the thread, this way the the while loop is paused for 1 second after every execution of the code inside it.

    Something like this:

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