2013-04-12 59 views
3

我仍然不相信我找不到任何問題,所以請隨時指出我的問題。相機停止移動一段時間後更新Google地圖

我正在使用顯示多個標記的Google地圖實施應用程序。我想讓它變成動態的,以便只繪製看到的標記。爲此,我希望能夠知道地圖什麼時候完全停止,然後等待幾秒鐘,以便在用戶可能仍然在移動地圖時不亂用地圖,然後清除標記並繪製新的地圖。如果用戶在定時器觸發前移動,它必須取消,然後再次開始計數。

到目前爲止,當使用onCameraChangeListener停止動畫時,我設法啓動相機更改,但it's definition指定在動畫中可能仍會調用該動畫。這是做到這一點的正確方法嗎?

第二個問題是關於定時器。我目前的執行情況如下:

map.setOnCameraChangeListener(new OnCameraChangeListener() { 
    public void onCameraChange(CameraPosition position) { 
     refresher.schedule(new refreshMapData(), 2000); 
    } 
}); 

而實際更新所需的標記定時器是這一個:

class refreshMapData extends TimerTask{ 

    public void run() { 
     map.clear(); 
     for (...) { 
      map.addMarker(...); 
     } 
    } 
} 

這顯然會拋出一個「Not主線程」異常並導致我下一個問題:這個問題的解決方法是什麼?如果我不允許在主線程之外執行此操作,那麼如何使用定時器修改Google Map的值?

編輯:關於第一個問題,我想我只需要比較自上次以來位置是否發生了變化,以便做到。只需要定時器更新問題的答案。

+0

現在請你分享一下這個代碼吧。我想要 –

+0

@QadirHussain很抱歉,我無法再訪問該項目。無論如何,我最終使用MaciejGórski的lib,[Android Maps Extensions](http://code.google.com/p/android-maps-extensions/),所以如果我是你,我幾乎可以放棄它。 – h4lc0n

回答

4

你會更好使用Handler。這不會創建額外的線程,這不是必需的。

在onCameraChange只需撥打這個:

handler.removeMessages(MSG_ID); 
handler.sendEmptyMessageDelayed(MSG_ID, 2000); 

handleMessage做你的工作。

如果只顯示幾個標記,爲什麼需要它動態?可見區域以外的標記沒有做得太慢。您清除並添加標記的代碼可能會使其變慢。

如果你要給成千上萬個標記,儘量Android Maps Extensions,這只是增加內置的可視標記。

+1

Very合理和深思熟慮的解決方案,我可以保證這適用於常規用例,例如在地圖周圍移動標記,以及何時安置標記在上面的文本框或類似物上落入的位置。 在此之前它會凍結,因爲onCameraChange中的代碼每次運行都會有變化。 – Odaym

相關問題