1

Приложение перестает отвечать на какое-то время, а затем возвращается к норме со всеми маркерами. Приложение зависает даже для списка с размером 30. Вот мой код,Приложение перестает отвечать на запросы нескольких геокодеров

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

Любая помощь будет оценена.

ответ

2

Ваша основная тема слишком много работает, и это может вызвать ANR.

Создание AsyncTask (documentation), который запрашивает геокодер и сделать Markers по методу onPostExecute (маркеры должны быть сделаны в основном потоке).

Ваш AsyncTask может быть, как это (не проверено):

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

Вы можете выполнить это следующим образом:

new QueryGeocoder().execute(data_arr);