1

I am currently trying to draw routes between 2 destinations utilizing requested JSON data from Google's Directions API. The version I currently have works well with destinations within around 150 miles. Yet when I try drawing poly lines across a state the application crashes. Below is the snippet of my Async task.

public class FetchRouteStepsFromService extends AsyncTask<Void,Void,StringBuilder> {

    private LocalBroadcastManager manager;
    private String currentAddress;
    private String destinationAddress;


    public FetchRouteStepsFromService(String currentAddress, String destinationAddress, Context context){
        this.currentAddress = currentAddress;
        this.destinationAddress = destinationAddress;
        manager = LocalBroadcastManager.getInstance(context);

    }


    private List<LatLng> decodePoly(String encoded) {

        List<LatLng> poly = new ArrayList<LatLng>();
        int index = 0, len = encoded.length();
        int lat = 0, lng = 0;

        while (index < len) {
            int b, shift = 0, result = 0;
            do {
                b = encoded.charAt(index++) - 63;
                result |= (b & 0x1f) << shift;
                shift += 5;
            } while (b >= 0x20);
            int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
            lat += dlat;

            shift = 0;
            result = 0;
            do {
                b = encoded.charAt(index++) - 63;
                result |= (b & 0x1f) << shift;
                shift += 5;
            } while (b >= 0x20);
            int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
            lng += dlng;

            LatLng p = new LatLng((((double) lat / 1E5)),
                    (((double) lng / 1E5)));
            poly.add(p);
        }

        return poly;
    }

    @Override
    protected void onPostExecute(StringBuilder result) {
        super.onPostExecute(result);
        try{

            JSONObject jsonObj = new JSONObject(result.toString());
            JSONArray routesJSONArray = jsonObj.getJSONArray("routes");
            JSONObject beforeLegsJSONObject = routesJSONArray.getJSONObject(0);
            JSONArray legsJSONArray = beforeLegsJSONObject.getJSONArray("legs");

            JSONObject beforeStepsJSONObject = legsJSONArray.getJSONObject(0);
            JSONArray stepsJSONArray = beforeStepsJSONObject.getJSONArray("steps");

            List<LatLng> test = new ArrayList<>();
            ArrayList<PolylineOptions> options = new ArrayList<>();
            map.clear();
            for(int i = 0; i < stepsJSONArray.length(); i++){
                JSONObject object = stepsJSONArray.getJSONObject(i);
                JSONObject polyLineObject = object.getJSONObject("polyline");
                String encodedPoly = polyLineObject.getString("points");//Holds the code for the polyline (String)
                test = decodePoly(encodedPoly);
                //Todo: Maybe create a separate asynctask to add latlngs on separate thread?
                for(int j = 0; j < test.size();j++){

                    PolylineOptions options1;
                    if(j != test.size() -1) {
                        LatLng startLocation = test.get(j);
                        LatLng nextLocation = test.get(j + 1);
                        options1 = new PolylineOptions().add(startLocation, nextLocation).width(5).color(Color.GREEN).geodesic(true);
                        map.addPolyline(options1);
                    }else{
                        LatLng startLocation = test.get(j);
                        LatLng nextLocation = test.get(j);
                        options1 = new PolylineOptions().add(startLocation, nextLocation).width(5).color(Color.GREEN).geodesic(true);
                        map.addPolyline(options1);

                    }

                }

            }
            dialog.dismiss();
            updateUI();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    protected StringBuilder doInBackground(Void... params) {
        try{

            StringBuilder jsonResults = new StringBuilder();
            String googleMapUrl = "https://maps.googleapis.com/maps/api/directions/json?" +
                    "origin="+currentAddress+"&" +
"destination="+destinationAddress+"&key=MY_KEY";

            URL url = new URL(googleMapUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            InputStreamReader in = new InputStreamReader(conn.getInputStream());
            int read;
            char[] buff = new char[3000];

            while((read = in.read(buff,0,3000)) != -1 ){
                jsonResults.append(buff,0,read);

            }
            return jsonResults;

        }catch (Exception e){

            Log.d("PlanTrip","doInBackgroud exception");
            e.printStackTrace();
        }
        return null;
    }



}

This is a local class within my Fragment which holds the Google Map. I previously have tried to make this AsyncTask its own class. This class would broadcast an intent consisting of PolyLineOptions which would be received by the fragment's BroadcastReceiver. Although this did not work either. Any resources, advice, or feedback would be greatly appreciated.

EDIT 1: Logcat during large request

enter image description here

enter image description here

Jcan1995
  • 39
  • 8
  • Could you post your `logcat` error? – antonio Jun 04 '17 at 09:48
  • @antonio I will post the logcat for when I make a large request although there are actually no errors. The progress dialog freezes for around 1 minute until the actual path is shown. When this happens the map moves ridiculously slow when I move it around. – Jcan1995 Jun 04 '17 at 15:05

0 Answers0