1

Die App reagiert für eine Weile nicht mehr und dann wieder mit allen Markierungen normal. Die App hängt sogar für eine Liste mit der Größe 30. Hier ist mein Code,App reagiert nicht mehr auf mehrere Geocoder Anfragen

private void addMarkersByPlace(List<JSONObject> data_arr){ 
    try { 
     for (int i = 0; i < data_arr.size(); i++) { 
      List<Address> addresses = geoCoder.getFromLocationName(data_arr.get(i).getString("position"), 1); 
      if (addresses.size() > 0) { 
       LatLng position = new LatLng(addresses.get(0).getLatitude()+(Math.random()/200),addresses.get(0).getLongitude()+(Math.random()/200)); 
       Bitmap bmImg = Ion.with(this).load(data_arr.get(i).getString("icon")).asBitmap().get(); 
       mMap.addMarker(new MarkerOptions() 
         .position(position) 
         .title(data_arr.get(i).getString("title")) 
         .snippet(data_arr.get(i).getString("snippet")) 
         .icon(BitmapDescriptorFactory.fromBitmap(bmImg)) 
       ); 
      } 
     } 
     progress.dismiss(); 
    } 
    catch (Exception e){ 
     txt_msg.setText("ERROR : "+ e.toString()); 
    } 
} 

Jede Hilfe wäre willkommen.

Antwort

2

Ihr Haupt-Thread funktioniert zu viel, und dies kann eine ANR verursachen.

Eine AsyncTask (documentation), die die geocoder abfragt und die auf den MarkersonPostExecute Verfahren zeichnen (die Markierungen auf dem Haupt-Thread gezogen werden müssen).

Ihre AsyncTask kann wie folgt (nicht getestet) sein:

new QueryGeocoder().execute(data_arr); 
:

private class QueryGeocoder extends AsyncTask<List<JSONObject>, Integer, List<Address>> { 
    @Override 
    protected List<Address> doInBackground(List<JSONObject>... objects) { 
     List<Address> addresses = new ArrayList<>(); 

     try { 
      for (JSONObject object : objects) { 
       addresses.add(geoCoder.getFromLocationName(object.getString("position"), 1)); 
      } 
     } 
     catch (Exception e){ 
     } 

     return addresses; 
    } 

    protected void onPostExecute(List<Address> result) { 
     for (Address address : result) { 
      LatLng position = new LatLng(address.getLatitude()+(Math.random()/200),address.getLongitude()+(Math.random()/200)); 
      Bitmap bmImg = Ion.with(this).load(address.getString("icon")).asBitmap().get(); 
      mMap.addMarker(new MarkerOptions() 
          .position(position) 
          .title(address.getString("title")) 
          .snippet(address.getString("snippet")) 
          .icon(BitmapDescriptorFactory.fromBitmap(bmImg)) 
      );     
     } 
    } 
} 

Sie es wie folgt ausführen

Verwandte Themen