Android карты асинхронной загрузки элементов наложения - PullRequest
4 голосов
/ 05 апреля 2011

У меня есть вид карты с тысячами элементов, которые я хочу загрузить.очевидно, я не могу загрузить их все, когда создается представление.

Я думаю, что я должен загрузить их асинхронно в соответствии с тем, что отображается в данный момент ..

Как я могу загрузить только элементы, расположенныев части карты, отображаемой на экране?

1 Ответ

8 голосов
/ 05 апреля 2011

Используйте AsyncTask для загрузки отдельных слоев на экран. Получить широту / долготу видимой в данный момент карты с помощью API MapView. На бэкэнде отправьте им ограничивающую рамку широты / долготы, чтобы получить нужные предметы. Примерно по памяти это будет примерно так:

public class LoadMapItems extends AsyncTask<Integer,Integer,List<ItemizedOverlay>> {
   private MapView view;

   public LoadMapItems( MapView view ) {
      this.view = view;
   }

   public List<ItemizedOverlay> doInBackground( Integer... params ) {
      int left = params[0];
      int top = params[1];
      int right = params[2];
      int bottom = params[3];

      return convertToItemizedOverlay( someService.loadSomething( left, top, right, bottom ) );
   } 

   private List<ItemizedOverlay> convertToItemizedOverlay( List<SomeObject> objects ) {
      // ... fill this out to convert your back end object to overlay items
   }

   public void onPostExecute(List<ItemizedOverlay> items) {
      List<Overlay> mapOverlays = mapView.getOverlays();
      for( ItemizedOverlay item : items ) {
         mapOverlays.add( item );
      }
   }
}

// somewhere else in your code you do this:

GeoPoint center = someMap.getMapCenter();
new LoadMapItems( someMap ).execute( 
      center.getLongitude() - someMap.getLongitudeSpan() / 2,
      center.getLatitude() - someMap.getLatitudeSpan() / 2,
      center.getLongitude() + someMap.getLongitudeSpan() / 2,
      center.getLatitude() + someMap.getLatitudeSpan() / 2);
...