1

앱이 잠시 동안 응답을하지 않고 모든 마커로 정상적으로 돌아옵니다. 응용 프로그램은 앱이 여러 지오 코더 요청에 응답하지 않습니다.

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

어떤 도움

주시면 감사하겠습니다, 심지어 크기 (30) 여기 내 코드가있는 목록을 멈 춥니 다.

답변

2

메인 스레드가 너무 많은 작업을 수행하므로 ANR이 발생할 수 있습니다.

지오 코더를 쿼리하고 onPostExecute 메서드에서 Markers을 그려주는 AsyncTask (documentation)를 만듭니다 (마커는 주 스레드에서 그려야합니다).

귀하의 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);