2011-04-05 2 views
3

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

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

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

ответ

8

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

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); 
+0

Спасибо! это очень полезно. Но как я могу обрабатывать изменения на текущей видимой карте? – Matteo

+0

Ваш MapView будет отправлять события, когда кто-то его перемещает. Во время этого обработчика событий вы будете использовать эту AsyncTask для загрузки данных из вашей базовой службы. Я бы получил эту работу, после того как она работает, я бы рассмотрел кэширование этих нагрузок в структуре данных, возможно, Map >. Он немного мешает, но он может сделать это намного быстрее. Затем вы проверите эту структуру данных, когда пользователь перетащит карту, чтобы узнать, уже ли вы загрузили эту плиту ... – chubbsondubs

+0

... На самом деле вам может быть проще назначить ваши накладки фиксированной ячейке сетки и загрузить эти ячеек сетки, которые пересекаются с текущим лат/длинным диапазоном MapView, как я иллюстрировал. Это упрощает кеширование сегментов фиксированной сетки. Вы можете загружать функции, которые существуют за пределами видимой области, но они будут небольшими. Максимальное количество ячеек сетки, которые вы загружаете, будет 4. Кроме того, оптимизация на бэкэнд проще, потому что ваша база данных может индексироваться по фиксированному ключу. Вам просто нужно преобразовать lat/long в номер ячейки сетки и загрузить функции, назначенные этому номеру ячейки сетки. – chubbsondubs

 Смежные вопросы

  • Нет связанных вопросов^_^