【问题标题】:How to dynamically update a specific overlayitem如何动态更新特定的覆盖项
【发布时间】:2012-07-18 11:19:34
【问题描述】:

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

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

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

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

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

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

我不知道在性能方面哪个是最好的。

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

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

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

/安迪

【问题讨论】:

    标签: android google-maps location overlay itemizedoverlay


    【解决方案1】:

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

    【讨论】:

    • 所以您建议创建一个自定义覆盖类并在其上绘制我的所有实体?哪一个会有更好的性能 - 您建议的自定义覆盖类与所有 500 个实体或类似的自定义覆盖类,每个实体一个(将有 500 个自定义覆盖类的对象)
    • 我相信没有明确的答案,因为这取决于自定义覆盖类的实现。如果我想确定性能,我会为这两种方法实现一个简单的测试用例,看看哪一种性能最好。
    【解决方案2】:

    我也遇到了同样的问题,我做的是你的首选。

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

    【讨论】:

      【解决方案3】:

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

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

      每次更新集合时,在 ItemizedOverlay 上调用 populate()

      查看此Tutorial 了解更多信息,如果您有任何问题,请发表评论。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-05
        • 2021-12-16
        • 1970-01-01
        • 1970-01-01
        • 2013-04-27
        • 2019-10-13
        • 2016-04-03
        相关资源
        最近更新 更多