android maps异步加载覆盖项

标签 android google-maps asynchronous itemizedoverlay

我有一个 map View ,其中包含我要加载的数千个项目。 显然我无法在创建 View 时全部加载它们。

我想我必须根据当前显示的内容异步加载它们..

如何只加载位于屏幕上显示的 map 部分的项目?

最佳答案

使用 AsyncTask 加载每个屏幕的各个层。使用 MapView api 获取当前可见 map 的纬度/经度。在后端向他们发送纬度/经度边界框以获取您想要的项目。所以粗略地从内存中它会是这样的:

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

关于android maps异步加载覆盖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5545996/

相关文章:

android - Eclipse ADT bundle 链接在哪里?

android - 有什么办法可以保护SD卡内的数据吗?

java - 在android中的 map 上添加五个标记

javascript - 是否可以从照片中读取地理标记以在谷歌地图 API 中使用?

android - 如何从谷歌地图或地点 API 获取地点的图片

javascript - 在执行操作之前等待 2 个异步 API 调用的结果

Android SDK占用大量磁盘空间

java - RecyclerView getChildCount() 和 getItemCount() 返回相同的值

javascript - 为什么javascript方法最后执行?

c# - 写入串行 COM 端口时如何实现异步功能?