首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android地图itemizedoverlay ConcurrentModificationException

Android地图itemizedoverlay ConcurrentModificationException
EN

Stack Overflow用户
提问于 2012-05-30 21:47:23
回答 1查看 464关注 0票数 0

我有一张带有定制覆盖的地图和一堆标记。因为我正在做标记分组,当缩放改变发生时,我必须清除重叠,为新的缩放重新分组项目,然后再躺在地图上。我在后台做这个是为了让事情顺利。因此,您单击缩放,标记消失,繁忙的指示器显示在角落和新的标记出现在地图上。所有都是平滑的,不过,当您连续放大两次或放大并立即缩小时,我会得到一致的修改异常。我读过很多关于这方面的文章,但没有一个解决方案适合我。例如,将地图移动到UI上的onPostExecute确实可以防止这一点,但是会冻结映射,绘制时间标记,这样就会失去平滑性。我试图在逐项覆盖同步列表上创建标记列表,但是没有帮助。我怎么才能阻止这一切?

这就是我所谓的缩放改变:

代码语言:javascript
复制
private void drawItems() {
  final MyMapView mw = this.mapView;

  //remove existing first
  //mw.getOverlays().remove(stuffOverlay);
  stuffOverlay.clearAll();
  //mw.invalidate();

  new AsyncTask<String, Integer, String>() {
    @Override
    protected void onPreExecute() {
      super.onPreExecute();
      ((ProgressBar)findViewById(R.id.mapProgressBar)).setVisibility(View.VISIBLE);
    }

    @Override
    protected String doInBackground(String... params) {
      //get items on map
      HashMap<String, JSONArray> groupedItems = getItemsForZoom(mw.getZoomLevel());

      if (groupedItems==null)
        return "done";

      //create a copy of it sometimes it was throwing concurentmodificationexception
      HashMap<String, JSONArray> groupedItemsCopy = new HashMap<String, JSONArray> (groupedItems);

      Iterator it = groupedItemsCopy.entrySet().iterator();
      while (it.hasNext()) { //loop over markers
        try {
          //get item 
          HashMap.Entry<String, Object> pair = (HashMap.Entry)it.next();
          JSONArray itemsInMarker = (JSONArray) pair.getValue();
          JSONObject itemData = (JSONObject) itemsInMarker.get(0);

          //get truncated coordinates
          String coordsKey = pair.getKey();
          String[] coordsSplitted = coordsKey.split("_");

          //add first marker to map
          GeoPoint gp = new GeoPoint((int)(Double.parseDouble(coordsSplitted[0])*1E6), (int)(Double.parseDouble(coordsSplitted[1])*1E6));
          OverlayItem markerOverlay = new OverlayItem(gp, "marker", "snipper text");
          Drawable markerPic = ServerCall.drawableFromUrl(((JSONObject)((JSONObject)itemData.get("picture")).get("1")).get("picture_full")+"_0.png");
          //markerPic.setBounds(0, 0, markerPic.getIntrinsicWidth(), markerPic.getIntrinsicHeight());
          markerPic.setBounds(-25, -25, 50, 50);
          markerOverlay.setMarker(markerPic);
          stuffOverlay.addOverlay(markerOverlay, itemData);

          if (stuffOverlay.size() > 0) {
            mapView.getOverlays().add(stuffOverlay);
          }
        } catch (JSONException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      return "done";
    }

    @Override
    protected void onPostExecute(String result) {
      super.onPostExecute(result);
      ((ProgressBar)findViewById(R.id.mapProgressBar)).setVisibility(View.GONE);
      mapView.invalidate();
    }
  }.execute();
}

这是我的逐项覆盖:

代码语言:javascript
复制
private class StuffOverlay extends ItemizedOverlay {
  private List<OverlayItem> mOverlays = Collections.synchronizedList(new ArrayList<OverlayItem>());
  private ArrayList<JSONObject> mStuff = new ArrayList<JSONObject>();
  public int currentItem;
  Map mMap;

  public StuffOverlay(Drawable defaultMarker, Map map) {
    super(boundCenterBottom(defaultMarker));
    mMap = map;
    populate(); //keep here
  }

  public void addOverlay(OverlayItem overlay, JSONObject stuffData) {
    synchronized (mOverlays) {
      mOverlays.add(overlay);
    }

    mStuff.add(stuffData);
    setLastFocusedIndex(-1);  //keep here
    populate();
  }

  public void clearAll() {
    synchronized (mOverlays) {
      mOverlays.clear();
    }

    setLastFocusedIndex(-1); //keep here
    populate();
  }

  @Override
  protected OverlayItem createItem(int i) {
    synchronized (mOverlays) {
      return mOverlays.get(i);
    }
  }

  @Override
  public int size() {
    synchronized (mOverlays) {
      return mOverlays.size();
    }
  }

  public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    if (!shadow) {
      super.draw(canvas, mapView, false);
    }
  }
}

,这就是我得到的;o( )

代码语言:javascript
复制
05-30 20:45:35.485: W/dalvikvm(1139): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
05-30 20:45:35.485: E/AndroidRuntime(1139): Uncaught handler: thread main exiting due to uncaught exception
05-30 20:45:35.495: E/AndroidRuntime(1139): java.util.ConcurrentModificationException
05-30 20:45:35.495: E/AndroidRuntime(1139):     at java.util.AbstractList$SimpleListIterator.next(AbstractList.java:64)
05-30 20:45:35.495: E/AndroidRuntime(1139):     at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:44)
05-30 20:45:35.495: E/AndroidRuntime(1139):     at com.google.android.maps.MapView.onDraw(MapView.java:476)
05-30 20:45:35.495: E/AndroidRuntime(1139):     at android.view.View.draw(View.java:6535)
05-30 20:45:35.495: E/AndroidRuntime(1139):     at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
05-30 20:45:35.495: E/AndroidRuntime(1139):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-31 03:15:11

我认为问题可能与以下几行有关:

代码语言:javascript
复制
      if (stuffOverlay.size() > 0) {
        mapView.getOverlays().add(stuffOverlay);
      }

您只需要将对象stuffOverlay添加到映射覆盖数组一次,甚至可以在stuffOverlay包含任何项之前完成它。我会将mapView.getOverlays().add(stuffOverlay);移到实例化stuffOverlay的位置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10824729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档