6

我正在开发一个基于位置的 android 应用程序,它处理大量的覆盖项目。

背景: 我想在地图上显示很多实体。实体的坐标随着它们的位置变化而实时变化。对应于更新的位置,实体应在地图上更新。实体可以增长到大量。

实现 我有两个覆盖。一个用于 MyLocationOverlay 以显示用户位置,另一个用于 ItemizedOverlay 子类,其中包含我需要在地图上显示的所有实体。

问题 每当实体的位置发生变化时,相应的覆盖项就需要更新。问题是我不确定哪种方法是实现这一目标的最佳方法。我有这些选择

  1. 当我收到特定实体的位置时,我从地图中删除所有叠加层并重新添加叠加层。现在使用更新的位置创建了覆盖项之一。

    List<Overlay> overlays = map.getOverlays();
    overlays.removeAll(overlays);
    overlays.add(new MyOverlay(marker,this));
    
  2. 我为每个实体创建一个叠加层。这意味着我将创建 500 个叠加层,每个叠加层仅包含一个叠加项。我创建了一个 Overlay 类的子类,并添加了我自己的属性以清楚地识别实体并为每个实体创建一个。当我到达特定实体的位置更新时,我会迭代并获取特定的覆盖项,将其删除并添加一个具有更新位置的新项。

我不知道哪个是最好的使用性能明智的。

当实体的数量超过 500 或 1000 个时,我觉得为每个实体的每个位置更新(可能很频繁)删除所有并重新添加所有覆盖会变得相当开销。

同时,遍历相同数量的实体也可以是相等的开销。

任何关于选择哪个或更好的实现方式的建议将不胜感激。

/安迪

4

3 回答 3

1

我相信最好的解决方案(关于性能)是创建一个从类继承的自定义 Overlay 类,Overlay以便您可以onDraw按照您想要的方式覆盖该方法。请参阅此之前的 SO 帖子以了解如何执行此操作。如果你想避免这种情况,你可以检查ItemizedOverlay,如果你还没有这样做的话。它比Overlay为每个实体创建一个更有效,但不如第一种方法建议的效率高。

于 2012-07-20T16:49:50.723 回答
0

我建议您将您的overlayItems 存储在一个HashSet 中,并将您的实体作为键。当实体更新时,您可以创建一个新的 OverlayItem 并将其存储在集合中。由于它是一个集合,旧的 OverlayItem 将被删除。

要显示 OverlayItems,请使用 ItemizedOverlay。在ItemizedOverlay.createItem(int position)方法中可以得到集合的OverlayItem。不要忘记用 覆盖该ItemizedOverlay.getSize()方法return set.size()

populate()每次更新集合时都会调用ItemizedOverlay。

查看本教程以获取更多信息,或者如果您有任何问题,请发表评论。

于 2012-07-27T15:16:51.620 回答
0

我有同样的问题,我所做的是你的第一选择。

无论如何,在将它们添加到地图之前,将它们加载到不同的线程上,并且在加载完所有图像和数据之后,将它们添加到主线程的地图上。

于 2012-07-27T11:54:16.197 回答