2012-03-29 46 views
-1

//获取纬度和经度loaddata function java.java.util.ConcurrentModificationException java.util.AbstractList $ SimpleListIterator.next(AbstractList.java:64)如何解决它?有人说使用迭代器。java.util.ConcurrentModificationException

public void loaddata() 
{ 
    try 
    { 

      lat = new String[vechno.length]; 
      lon=new String[vechno.length]; 
      for(int i=0;i<vechno.length;i++) 
      { 

       if(Integer.parseInt(vechspeed[i].trim())==0||vechspeed[i].trim()=="") 
       { 
        latiloni=call2(vechno[i].toString()); 
        lat[i]=latiloni[0]; 
        lon[i]=latiloni[1]; 
        GeoPoint point1 = new GeoPoint((int)(Double.parseDouble(lat[i])*1E6),(int)(Double.parseDouble(lon[i])*1E6)); 
        OverlayItem overlayItem = new OverlayItem(point1,"Vehicle No : "+vechno[i]+"(Idle)", 
          "Located   : "+vechloc[i]+"\n"+"Speed(kmph) : "+vechspeed[i]+"\n"+"Address   : "+vechadd[i]); 
        itemizedOverlay0.addOverlay(overlayItem); 
        final MapController mc = mapView.getController(); 
        mc.animateTo(point1); 
        mc.setZoom(6); 
        mapOverlays.add(itemizedOverlay0); 


       } 
       else 
       if(Integer.parseInt(vechspeed[i].trim())>=1&&Integer.parseInt(vechspeed[i].trim())<=20) 
       { 
        latiloni=call2(vechno[i].toString()); 
        lat[i]=latiloni[0]; 
        lon[i]=latiloni[1]; 
        GeoPoint point2 = new GeoPoint((int)(Double.parseDouble(lat[i])*1E6),(int)(Double.parseDouble(lon[i])*1E6)); 
        OverlayItem overlayItem = new OverlayItem(point2,"Vehicle No : "+vechno[i]+"(Running)", 
          "Located   : "+vechloc[i]+"\n"+"Speed(kmph) : "+vechspeed[i]+"\n"+"Address   : "+vechadd[i]); 
        itemizedOverlay1.addOverlay(overlayItem); 
        final MapController mc = mapView.getController(); 
        mc.animateTo(point2); 
        mc.setZoom(6); 
        mapOverlays.add(itemizedOverlay1); 

       } 
       else 
       if(Integer.parseInt(vechspeed[i].trim())>=21&&Integer.parseInt(vechspeed[i].trim())<=40) 
       { 
         latiloni=call2(vechno[i].toString()); 
         lat[i]=latiloni[0]; 
         lon[i]=latiloni[1]; 
         GeoPoint point3 = new GeoPoint((int)(Double.parseDouble(lat[i])*1E6),(int)(Double.parseDouble(lon[i])*1E6)); 
         OverlayItem overlayItem = new OverlayItem(point3,"Vehicle No : "+vechno[i]+"(Running)", 
           "Located   : "+vechloc[i]+"\n"+"Speed(kmph) : "+vechspeed[i]+"\n"+"Address   : "+vechadd[i]); 
         itemizedOverlay2.addOverlay(overlayItem); 
         final MapController mc = mapView.getController(); 
         mc.animateTo(point3); 
         mc.setZoom(6); 
         mapOverlays.add(itemizedOverlay2); 

       } 
       else 
       if(Integer.parseInt(vechspeed[i].trim())>=41&&Integer.parseInt(vechspeed[i].trim())<=60) 
       { 
         latiloni=call2(vechno[i].toString()); 
         lat[i]=latiloni[0]; 
         lon[i]=latiloni[1]; 
         GeoPoint point4 = new GeoPoint((int)(Double.parseDouble(lat[i])*1E6),(int)(Double.parseDouble(lon[i])*1E6)); 
         OverlayItem overlayItem = new OverlayItem(point4,"Vehicle No : "+vechno[i]+"(Running)", 
           "Located   : "+vechloc[i]+"\n"+"Speed(kmph) : "+vechspeed[i]+"\n"+"Address   : "+vechadd[i]); 
         itemizedOverlay3.addOverlay(overlayItem); 
         final MapController mc = mapView.getController(); 
         mc.animateTo(point4); 
         mc.setZoom(6); 
         mapOverlays.add(itemizedOverlay3); 

       } 
       else 
       if(Integer.parseInt(vechspeed[i].trim())>=61&&Integer.parseInt(vechspeed[i].trim())<=80) 
       { 
         latiloni=call2(vechno[i].toString()); 
         lat[i]=latiloni[0]; 
         lon[i]=latiloni[1]; 
         GeoPoint point5 = new GeoPoint((int)(Double.parseDouble(lat[i])*1E6),(int)(Double.parseDouble(lon[i])*1E6)); 
         OverlayItem overlayItem = new OverlayItem(point5,"Vehicle No : "+vechno[i]+"(Running)", 
           "Located   : "+vechloc[i]+"\n"+"Speed(kmph) : "+vechspeed[i]+"\n"+"Address   : "+vechadd[i]); 
         itemizedOverlay4.addOverlay(overlayItem); 
         final MapController mc = mapView.getController(); 
         mc.animateTo(point5); 
         mc.setZoom(6); 
         mapOverlays.add(itemizedOverlay4); 

       } 
       else 
       if(Integer.parseInt(vechspeed[i].trim())>=81&&Integer.parseInt(vechspeed[i].trim())<=120) 
       { 

         latiloni=call2(vechno[i].toString()); 
         lat[i]=latiloni[0]; 
         lon[i]=latiloni[1]; 
         GeoPoint point6 = new GeoPoint((int)(Double.parseDouble(lat[i])*1E6),(int)(Double.parseDouble(lon[i])*1E6)); 
         OverlayItem overlayItem6 = new OverlayItem(point6,"Vehicle No : "+vechno[i]+"(Running)", 
           "Located   : "+vechloc[i]+"\n"+"Speed(kmph) : "+vechspeed[i]+"\n"+"Address   : "+vechadd[i]); 
         itemizedOverlay5.addOverlay(overlayItem6); 
         final MapController mc = mapView.getController(); 
         mc.animateTo(point6); 
         mc.setZoom(6); 
         mapOverlays.add(itemizedOverlay5); 

       } 
       else 
       if(Integer.parseInt(vechspeed[i].trim())>=120&&Integer.parseInt(vechspeed[i].trim())<=150) 
       { 
         latiloni=call2(vechno[i].toString()); 
         lat[i]=latiloni[0]; 
         lon[i]=latiloni[1]; 
         GeoPoint point7 = new GeoPoint((int)(Double.parseDouble(lat[i])*1E6),(int)(Double.parseDouble(lon[i])*1E6)); 
         OverlayItem overlayItem = new OverlayItem(point7,"Vehicle No : "+vechno[i]+"(Running)", 
           "Located   : "+vechloc[i]+"\n"+"Speed(kmph) : "+vechspeed[i]+"\n"+"Address   : "+vechadd[i]); 
         itemizedOverlay6.addOverlay(overlayItem); 
         final MapController mc = mapView.getController(); 
         mc.animateTo(point7); 
         mc.setZoom(6); 
         mapOverlays.add(itemizedOverlay6); 

       } 

      } 
      mapView.invalidate(); 
    } 
    catch(Exception e) 
    { 

    } 

} 
protected void dosomthing() 
{ 
     progressdialog1=ProgressDialog.show(Mapping.this, "", "Loading.Please wait..."); 
     Runnable threadTask = new Runnable() { 

      @Override 
      public void run() { 

       while(true){ 
        try { 
         Thread.sleep(2000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
        loaddata(); 
        messageHandler.sendEmptyMessage(0); 

       } 
      } 
     }; 
     (new Thread(threadTask)).start(); 
} 
+0

看一看这个答案:http://stackoverflow.com/questions/3184883/concurrentmodificationexception-for-arraylist – 2012-03-29 10:33:23

回答

2

很难确切地看到异常来自哪里,我怀疑它实际上并不在您向我们展示的代码中。如果您提供了完整的堆栈跟踪,请在代码中突出显示与跟踪中行号对应的行,我们可以将其跟踪。


那么是什么原因ConcurrentModificationException s?基本上,它们发生在集合被修改时,而集合的Iterator被使用;例如像这样:

List<String> l = ... 
    for (String s : l) { 
     if (s.equals("42")) { 
      l.add("43"); 
     } 
    } 

如果它发现"42"很可能会在第二行发生CME。避免CME的方法是在迭代它们时不修改集合......或者其他一些线程可能正在迭代它们。

有一对夫妇的方式来解决这个问题:

  • 的ConcurrentCxxx集合类提供不会抛出CME迭代器。缺点是它们比类似的实现类更普通(单线程)使用更昂贵。

  • 如果你是为了移除元素迭代列表,你可以做到这一点使用方法Iterator.remove();例如

    List<String> l = ... 
    Iterator<String> it = l.iterator(); 
    while (l.hasNext()) { 
        String s = it.next(); 
        if (s.equals("42")) { 
         l.remove(); // removes the string returned by last call to next() 
        } 
    } 
    

    但是,这只适用于这个特定的用例。你不能像这样添加或替换列表元素。

+0

03-29 15:48:59.271:E/AndroidRuntime(316):未捕获的处理程序:线程主要由于未捕获的异常而退出 03-29 15:48:59.330:E/AndroidRuntime(316):java.util.ConcurrentModificationException 03-29 15:48:59.330:E/AndroidRuntime(316):\t at java。 util.AbstractList $ SimpleListIterator.next(AbstractList.java:64) 03-29 15:48:59.330:E/AndroidRuntime(316):\t at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:44 ) – user1300479 2012-03-29 11:12:59

+0

在代码中没有调用'draw'的地方。它看起来像你的代码必须在其他事件(一个事件监听器线程?)迭代它们以便绘制它们的同时添加覆盖。你可能不应该这样做......但我不是Android开发人员。 – 2012-03-29 11:32:55

相关问题