我正在尝试运行一个特定的代码,定期在地图上添加/删除标记,我尝试了AsyncTask方法而不是线程和runnable,
doInBackground中的:
mapView.getOverlays.remove()
mapView.getOverlays.addOverlay(new overlay)
mapView.getController.animate(center point)
实际问题是,该代码连续运行,并且执行map时会执行渲染并尝试绘制叠加层,而代码正在删除并添加到列表中,因此抛出ConcurrentModificationException并且应用程序暂停
我需要帮助,我觉得我走错了路,在尝试在后台线程中运行代码时,我应该使用什么才能在地图上定期更新标记?
答案 0 :(得分:1)
UI不是线程安全的,因此您不能从非主线程更新ui组件。 AsyncTask有从主线程调用的方法。我们的想法是准备doInBackgraound
中的所有数据,然后使用postExecute
方法更新用户界面。
答案 1 :(得分:0)
如果您不想像s korolev建议那样将所有点一起渲染,请使用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);