2012-07-18 77 views
6

我正在開發一個基於位置的android應用程序,它處理很多覆蓋項目。如何動態更新特定的overlayitem

背景: 我想在地圖上顯示不少實體。實體的座標隨着其位置變化而實時變化。對應於更新的位置,實體應在地圖上更新。實體可以增長到很多。

執行 我有兩個覆蓋。一個用於顯示用戶位置的MyLocationOverlay,另一個用於顯示我需要在地圖上顯示的所有實體的ItemizedOverlay子類。

問題 每當實體的位置發生變化時,相應的overlayitem需要更新。問題是我不確定哪個是完成這個最好的方法。我有這些選擇

  1. 當我收到特定實體的位置時,我從地圖中刪除所有疊加層並重新添加疊加層。現在使用更新的位置創建了一個疊加項目。

    List<Overlay> overlays = map.getOverlays(); 
    overlays.removeAll(overlays); 
    overlays.add(new MyOverlay(marker,this)); 
    
  2. 我爲每個實體創建一個覆蓋。這意味着我將創建500個疊加層,每個疊加層只包含一個疊加層項目。我創建了一個Overlay類的子類,並添加了我自己的屬性以清楚地標識實體併爲其創建一個。當我到達特定實體的位置更新時,我迭代並獲取特定的覆蓋項目,將其刪除並添加一個具有更新位置的新項目。

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

我覺得移除所有並重新添加爲每一個位置更新所有覆蓋(這是相當常見)每一個實體的成爲當實體數量變得相當的開銷超過500或1000

與此同時,迭代相同數量的實體也可能會產生相同的開銷。

任何意見可以選擇哪一個或更好的方法來實現這一點,將不勝感激。

/安迪

回答

1

我認爲最好的解決辦法(關於性能)是從Overlay類創建一個繼承自定義覆蓋類,這樣就可以覆蓋onDraw方法你想要的方式。看到這個previous SO post瞭解如何做到這一點。如果你想避免這種情況,你可以檢查ItemizedOverlay,如果你還沒有這樣做。它比爲每個實體創建Overlay更有效,但效率不如第一種方法建議的效率高。

+0

因此,你建議創建一個自定義覆蓋類,並讓我所有的實體繪製?哪一個會有更好的表現 - 一個自定義的覆蓋類,就像你建議的所有500個實體或類似的自定義覆蓋類,每個實體一個(將有500個自定義覆蓋類的對象) – andy 2012-07-23 17:58:32

+3

我相信自從沒有明確的答案以來這取決於自定義覆蓋類的實現。如果我想確保性能,我會爲這兩個appraches實現一個簡單的測試用例,並查看哪個具有最佳性能。 – Angelo 2012-07-24 07:03:57

0

我有同樣的問題,我做的是你的第一選擇。

無論如何,在將它們添加到地圖之前,將它們加載到不同的線程中,並且在加載所有圖像和數據後,將它們添加到主線程的地圖上。

0

我建議你將你的overlayItems存儲在一個HashSet中,並將你的實體作爲關鍵字。當實體更新時,您可以創建一個新的OverlayItem並將其存儲在集合中。因爲它是一箇舊的OverlayItem將被刪除。

要顯示OverlayItems,請使用ItemizedOverlay。在ItemizedOverlay.createItem(int position)方法中,您可以獲取該集合的OverlayItem。 不要忘記用return set.size()覆蓋ItemizedOverlay.getSize()方法。

每次更新該設置時,在ItemizedOverlay上調用populate()

看看這個Tutorial欲瞭解更多信息,或發表評論,如果您有問題。

相關問題