Нужно улучшить наложение на Android карты - PullRequest
0 голосов
/ 27 октября 2011

Я пытаюсь запустить определенный код, который регулярно добавляет / удаляет маркеры на карте, я пробовал подход AsyncTask вместо потока и запуска,

в doInBackground:

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

Фактическая проблема заключается в том, что код выполняется непрерывно, и при выполнении map получает рендеринг и пытается получить оверлеи для рисования, в то время как код удаляется и добавляется в список, поэтому выбрасывается ConcurrentModificationException, и приложение останавливается

Мне нужна помощь по этому поводу, я чувствую, что нахожусь на неверном пути, что на самом деле я должен использовать при попытке запустить код в фоновом потоке, который регулярно обновляет маркеры на карте ??

Ответы [ 2 ]

1 голос
/ 27 октября 2011

Пользовательский интерфейс не является потокобезопасным, поэтому нельзя обновлять компоненты пользовательского интерфейса из неосновного потока. AsyncTask имеет mthods, которые вызываются из основного потока. Идея состоит в том, чтобы подготовить все данные в doInBackgraound, а затем обновить пользовательский интерфейс в методе postExecute.

0 голосов
/ 27 октября 2011

Если вы не хотите отображать точки все в одном, как предложено slkorolev, используйте механизм обработчика пользовательского интерфейса.


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); 
...