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