2016-06-28 10 views
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が発生することがあります。

ジオコーダーに照会し、onPostExecuteメソッドでMarkersを描画するAsyncTask(documentation)を作成します(マーカーはメインスレッドで描画する必要があります)。

あなたAsyncTaskは、この(テストしていない)ようにすることができます:

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

関連する問題