0

在我的应用程序中,我有一个Service接收位置更新并将它们存储到数据库。我也有一个Fragment,它显示从数据库中记录的所有航点的MapViewPolyLine更好的方式来更新PolyLine轨道的GPS读数

在录制过程中,Service通知Fragment有关新的路标,因此Fragment可以更新PolyLine。问题是,当用户从应用程序导航离开应用程序Service保持记录航点到数据库,但现在FragmentFragment暂停后不会更新。因此,在onResume中,我创建了一个新的PolyLine,读取数据库中的所有路点并将它们添加到数据库中。

这一切都工作正常,但它并不真的觉得它是从性能角度来说是最佳的创建一个新的PolyLine并重新添加所有的航点(可能有成千上万!)。我想我可以重新添加任何尚未在PolyLine中的新航点,但我想看看这里有人是否有替代解决方案?即使应用程序处于后台(只要服务正在运行),是否有任何方法可以使Fragment“保持活动状态”并更新其PolyLine?还是有更好的方法来做到这一点?

回答

2

重塑折线可能是不可避免的,但在这里,你应该想想,如果性能成为一个问题做一些事情:

把时间限制。当重新创建多段线时,只能在最近一小时或一天中获取数据(测试,您可以在此确定最佳值),并提供延长该时间段的选项。这会让用户更加了解数据需要一些时间来加载,并且该应用将使用更多的资源。

在保存数据时汇总数据。这应该会减少用于保存数据库中的点的磁盘空间(对于低端设备非常重要),并在重建活动时提高性能。以下是可以减少数量的一些提示:

  1. 检查后面2点,看看它们是否是直线。如果是这样,请删除中间的一个。这应该会消除用户在车内或长途行走时记录的大量数据。
  2. 检查最后一组点(5个或更多)是否在同一区域,这样可以减少很多数据的。因此,如果用户只是在自己的家中或工作场所进行扫描,那么您可以在不丢失太多数据的情况下为其节省一点,在大多数(99%)的应用程序中这应该不是问题。
+0

谢谢,这是一些很好的建议!当我注册我的位置更新侦听器时,我已经在做#2(默认距离为10米)。直线检测是一个很好的,不知道如何实现它 - 它需要某种宽容... – BadCash

+0

@BadCash有几种方法可以实现这一点。我能想到的最好的方法是计算中间点到两个周围点所创建线的距离,并检查它是否小于由您需要的误差范围确定的某个值。 –

+0

再次感谢:)是的,这将是一种方式。我还有一个想法 - 如果我将AmB(m =中点)的路径长度与直路径AB的长度进行比较,如果第一个路径与直路径的距离在一定的公差范围内(长于)可以认为是直的? – BadCash