2013-02-20 1 views
0

서버에서 보낸지도 지점을받는 스레드가 있고이 지점은 MapView에 추가됩니다. 이것은 잘 작동하지만 MapView (예 : 확대/축소, 팬 등)과 상호 작용하는 경우 ConcurrentModificationException이 표시되므로 MapView에 포인트를 추가하는 동안 사용자에게 액세스를 허용 할 수 있습니까?사용자가지도와 상호 작용할 수 있도록하면서 Google지도보기에 점을 추가하는 방법은 무엇입니까?

02-20 01:44:26.566: E/AndroidRuntime(9448):  FATAL EXCEPTION: main 
02-20 01:44:26.566: E/AndroidRuntime(9448):  java.util.ConcurrentModificationException 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:41) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at com.google.android.maps.MapView.onDraw(MapView.java:532) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.View.draw(View.java:13707) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.View.draw(View.java:13591) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.View.draw(View.java:13589) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.View.draw(View.java:13589) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.View.draw(View.java:13589) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.View.draw(View.java:13710) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.widget.FrameLayout.draw(FrameLayout.java:467) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2211) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.ViewRootImpl.drawSoftware(ViewRootImpl.java:2281) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.ViewRootImpl.draw(ViewRootImpl.java:2177) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2045) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1854) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.Choreographer.doFrame(Choreographer.java:532) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.os.Handler.handleCallback(Handler.java:725) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.os.Handler.dispatchMessage(Handler.java:92) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.os.Looper.loop(Looper.java:137) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
02-20 01:44:26.566: E/AndroidRuntime(9448):  at dalvik.system.NativeStart.main(Native Method) 

답변

0

, 실제로 UI 스레드에서 포인트를 추가/업데이트해야합니다. 이렇게하면 동시 수정 문제가 발생하지 않습니다. 추가/업데이트 프로세스가 너무 무거울 때까지 사용자 경험을 크게 방해해서는 안됩니다.

+0

고마워, 나는 전에 이것을 시도했지만 네트워크 물건을 거기에서하고 있었고, 일단 나는 단지 UI 작업을하고 있었다. –

1

새지도 api를 사용해 보았습니까? 개인적으로 사용하기가 훨씬 쉽고 기존 API에서 새 API로 쉽게 변경 될 수 있음을 알게되었습니다.

링크 : 나는 특히 개선 발견 https://developers.google.com/maps/documentation/android/

한 가지지도의 도면이다. 오버플로가 많은 등의 문제가 없습니다. 새로운 API를 사용하여 추가 핀 예이다 : 그것은 백그라운드 스레드에서 서버에서 포인트를받을 적절한이지만

final GoogleMap map = this.getMap(); 
    final MarkerOptions marker = new MarkerOptions(); 
    marker.position(latlng); 
    marker.draggable(false); 
    marker.icon(BitmapDescriptorFactory.fromResource(drawable)); 
    map.addMarker(marker); 
+0

내 결정에 새로운지도를 사용 하겠지만, 불행히도 과제물을 사용하고 있습니다. –

0

이전 API를 사용하는 일부 오래된 코드를 추출하고 위생적으로 처리하려고했습니다. 하이라이트는 다음과 같습니다

  1. 지도
  2. 도면에 아직이고, 그렇지 않으면
을 다시 그리기지도를 강제로지도
  • 에 오버레이를 추가 오버레이
  • 을 준비 오버레이 만들기

    이 방법을 작업에 추가하십시오.

    // check if overlay we are adding was already added 
    final List<Overlay> listOfOverlays = this.mMapView.getOverlays(); 
    if ((this.mPinsOverlay != null) && listOfOverlays.contains(this.mPinsOverlay)) 
    { 
        listOfOverlays.remove(this.mPickupOverlay); 
    } 
    
    // create overlay 
    this.mPinsOverlay = new PinsOverlay(); 
    
    // add overlay to map 
    listOfOverlays.add(this.mPinsOverlay); 
    
    // force map to redraw 
    this.mMapView.postInvalidate(); 
    

    맞춤 오버레이 클래스는 필요하지 않지만 상황을 깔끔하게 유지합니다.

  • 관련 문제