2016-07-01 27 views
3

Arbeit Zusammenfassung ..Entfernung zwischen mehreren Punkten in Android Listview

ich auf Projekt arbeiten, wo wir die Fahrt vom Benutzer aktuellen Standort und in der Nähe Benutzer Standort berechnen.

Es kann eine doppelte Frage für die Berechnung der Einzelpunktentfernung sein, aber ich möchte die Entfernungsberechnung für mehrere Orte in der benutzerdefinierten Listenansicht.

Andere Benutzerorte in der Nähe kommen von web api mit ihren Namen und Detailinformationen.

Um die Fahrstrecke zwischen zwei Punkten zu bekommen benutze ich die Google Direction api.

Es gibt mir das Ergebnis, aber es verlangsamt die App und wenn mehr Daten es dann ist, wird es das Gerät hängen ..

Voraussetzung:

Ich brauche die Fahrstrecke, um herauszufinden, zwischen zwei Position in benutzerdefinierter Listenansicht korrekt und reibungslos ..

was ich getan habe:

fand ich diesen Link zu Async Loading aber es funktioniert auch nicht richtig. App abgestürzt beim Scrollen der Listenansicht. Hier

ist der Code von Async Loading ..

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    viewHolder holder; 

    if (convertView == null) { 
     holder = new viewHolder(); 
    } else { 
     holder = (viewHolder) convertView.getTag(); 
    } 

    new getDistanceAsyncTask(position, holder, userLatt, userLong, sLatt1, sLong1).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null); 

    return convertView; 
} 


private static class getDistanceAsyncTask extends AsyncTask { 
    private int mPosition; 
    private viewHolder mHolder; 
    double Lat1, Lng1, Lat2, Lng2; 

    public getDistanceAsyncTask(int position, viewHolder holder, double lat1, double lng1, double lat2, double lng2) { 
     mPosition = position; 
     mHolder = holder; 
     this.Lat1 = lat1; 
     this.Lng1 = lng1; 
     this.Lat2 = lat2; 
     this.Lng2 = lng2; 
    } 

    @Override 
    protected Object doInBackground(Object... params) { 
     // TODO Auto-generated method stub 

     String distanceST = ""; 
     Double dist = 0.0; 
     String uri = "http://maps.googleapis.com/maps/api/directions/json?origin=" + Lat1 + "," + Lng1 + "&destination=" + Lat2 + "," + Lng2 + "&mode=driving&sensor=false"; 
     String result = GET(uri); 
     Log.d("result", "res=" + result); 

     JSONObject jsonObject = new JSONObject(); 
     try { 
      jsonObject = new JSONObject(result.toString()); 
      JSONArray array = jsonObject.getJSONArray("routes"); 
      JSONObject routes = array.getJSONObject(0); 
      JSONArray legs = routes.getJSONArray("legs"); 
      JSONObject steps = legs.getJSONObject(0); 
      JSONObject distance = steps.getJSONObject("distance"); 

      distanceST = distance.getString("text"); 
      dist = Double.parseDouble(distanceST.replaceAll("[^\\.]", "")); 

      // Utils.showToastMsg(HomeActivity.this, "Dist is :: " + dist); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return distanceST; 
    } 

    @Override 
    protected void onPostExecute(Object result) { 
     // TODO Auto-generated method stub 
     mHolder.txtMerDistance1.setText(result.toString()); 

    } 
} 

private static String GET(String url) { 
    InputStream inputStream = null; 
    String result = ""; 
    try { 
     // create HttpClient 
     HttpClient httpclient = new DefaultHttpClient(); 
     // make GET request to the given URL 
     HttpResponse httpResponse = httpclient.execute(new HttpGet(url)); 
     // receive response as inputStream 
     inputStream = httpResponse.getEntity().getContent(); 
     // convert inputstream to string 
     if (inputStream != null) 
      result = convertInputStreamToString(inputStream); 
     else 
      result = "not work!"; 

    } catch (Exception e) { 
     Log.d("InputStream", "hello" + e); 
    } 
    return result; 
} 

private static String convertInputStreamToString(InputStream inputStream) throws IOException { 
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
    String line = ""; 
    String result = ""; 
    while ((line = bufferedReader.readLine()) != null) 
     result += line; 
    inputStream.close(); 
    return result; 
} 

Bitte helfen Sie, ob es eine beste Lösung dafür ist.

+0

zu berechnen, was der Prozess verlangsamt? Der Aufruf an Google API oder die Wiederherstellung des Benutzerstandortes? Wahrscheinlich eine asynchrone Aufgabe in der getview ist eine schlechte Idee. Dies ist Anruf bei jeder Bewegung in Ihrer Liste (denke ich) – AxelH

+0

@AxelH, Ja Anruf zu Google API verlangsamen die App .. Ich stimme zu, dass Anruf API in getview ist schlechte Idee. Also bitte schlagen Sie für jede andere Lösung vor. –

+0

Dies sollte ausgeführt werden, bevor es an die Listview übergeben wird. Wenn Sie die Liste für den Adapter wiederherstellen. Und es wird nur eine (oder wenige) asynchrone Task ausgeführt und nicht für jede Instanz. Es dauert einige Zeit, aber wenn Sie es schaffen ** zu berechnen **, wenn kein Wert in Ihrem Halter vorhanden ist, könnte dies benutzerfreundlich sein – AxelH

Antwort

0

können Sie android.location.Location Klasse verwenden, um Abstand

Location.distanceBetween()

+0

Liebe, es gibt nicht die Fahrdistanz .. Es gibt den kürzesten Weg zwischen dem gegebenen Punkt. –

+0

** Ich muss die Entfernung zwischen zwei Orten in der benutzerdefinierten Listenansicht genau und reibungslos ermitteln .. ** Sie haben nach Entfernung zwischen Ort gefragt ... also gab er Ihnen die Lösung;) – AxelH

+0

@AxelH, tut mir leid. ... Lassen Sie mich meine Frage aktualisieren .. –

Verwandte Themen