我正在开发一个基于位置的Android应用程序,它处理大量的叠加项目。
背景 我想在地图上显示很多实体。实体的坐标随着位置的变化而实时变化。对应于更新的位置,实体应在地图上更新。实体可以增长到很多。
实施 我有两个叠加。一个用于显示用户位置的MyLocationOverlay,另一个用于显示我需要在地图上显示的所有实体的ItemizedOverlay子类。
问题 无论何时更改实体的位置,都需要更新相应的overlayitem。问题是我不确定哪种方法是最好的方法。我有这些选择
当我收到特定实体的位置时,我会从地图中删除所有叠加层并重新添加叠加层。现在使用更新的位置创建其中一个叠加层。
List<Overlay> overlays = map.getOverlays();
overlays.removeAll(overlays);
overlays.add(new MyOverlay(marker,this));
我为每个实体创建了一个叠加层。意思是我将创建500个叠加层,每个叠加层只包含一个叠加层项目。我创建了一个Overlay类的子类,并添加了我自己的属性来清楚地标识实体并为每个实体创建一个。当我到达特定实体的位置更新时,我会迭代并获取特定的覆盖项,删除它并添加一个更新位置的新项目。
我不知道哪个是性能明智的最佳选择。
我觉得删除所有重叠并重新添加所有叠加层,当实体数量超过500或1000时,每个单个实体的每个单独位置更新(可能经常)都会成为相当大的开销。
同时,迭代相同数量的实体也可能是相同的开销。
任何可供选择的建议或更好的实施方法都将受到赞赏。
/安迪
答案 0 :(得分:1)
我认为最佳解决方案(关于性能)是创建一个继承自Overlay
类的自定义Overlay类,以便您可以按照自己的方式覆盖onDraw
方法。请参阅此previous SO post以了解如何执行此操作。如果您想避免这种情况,可以查看ItemizedOverlay,如果您还没有这样做的话。它比为每个实体创建Overlay
更有效,但效率不如第一种方法所建议。
答案 1 :(得分:0)
我遇到了同样的问题,我所做的是你的第一选择。
无论如何,在将它们添加到地图之前,将它们加载到不同的线程上,并且在加载了所有图像和数据之后,将它们添加到主线程上的地图上。
答案 2 :(得分:0)
我建议您将overlayItems存储在HashSet中,并将实体作为键。更新实体后,您可以创建一个新的OverlayItem并将其存储在集合中。因为它是一个集合,旧的OverlayItem将被删除。
要显示OverlayItems,请使用ItemizedOverlay。在ItemizedOverlay.createItem(int position)
方法中,您可以获取集合的OverlayItem。
不要忘记使用ItemizedOverlay.getSize()
覆盖return set.size()
方法。
每次更新集合时,ItemizedOverlay上都会调用populate()
。
如果您有任何疑问,请查看此Tutorial或发表评论。