2011-10-27 44 views
0

我試圖運行特定的代碼,定期添加/在地圖上刪除標記,我試過的AsyncTask方法取代螺紋和可運行在doInBackground需要加強在Android MapView的覆蓋

mapView.getOverlays.remove() 
mapView.getOverlays.addOverlay(new overlay) 
mapView.getController.animate(center point) 

實際的問題是,該代碼會連續運行,當執行地圖被渲染,並試圖獲得疊加繪製,而代碼刪除和添加到列表中,這樣ConcurrentModificationException的拋出和應用程序停止

我需要關於它的幫助,我覺得我在錯誤的道路上,當我試圖在後臺線程中運行代碼以便定期更新地圖上的標記時,我應該使用什麼?

回答

0

如果您不想像slkorolev建議的那樣一次渲染所有點,請使用UI處理程序機制。


Handler myHandler = new Handler() { 
publicvoid handleMessage(Message msg) { 
switch (msg.what) { 
case TestHandler.NEW_OVERLAY_ITEM_EVENT: 
mapView.getOverlays.remove() 
mapView.getOverlays.addOverlay(new overlay) 
mapView.getController.animate(center point) 
break; 
       } 
super.handleMessage(msg); 
      } 
    }; 

// post this UI update event 
Message message = new Message(); 
message.what = TestHandler.NEW_OVERLAY_ITEM_EVENT;  
TestHandler.this.myHandler.sendMessage(message); 
+1

我也嘗試了您的方法,並且我發現它非常有幫助,實際上它解決了整個問題:) –

1

UI不是線程安全的,因此您不得更新非主線程中的ui組件。 AsyncTask具有從主線程調用的方法。這個想法是準備doInBackgraound中的所有數據,然後更新postExecute方法中的UI。

+0

這是偉大的,但我應該如何再次重複,並再次運行任務,這就是我堅持 –

+0

@Smartdog:作爲的AsyncTask只能只有當你執行每次需要後臺計算時都必須實例化它。其他方法也有很好的評論[這裏](http://android-developers.blogspot.com/2009/05/painless-threading.html)。 – slkorolev

+0

我已經閱讀了很多關於網絡這個話題,但它給了我比我想要的少得多,無論如何我開發了另一個解決方案,做了我真正想要的,無論如何感謝您的關心和時間 –