2013-08-12 96 views
1

我想迭代通过散列表,并在我的迭代过程中使用密钥。我决定在异步任务中使用它,因为迭代阻塞了我的UI线程。迭代通过hasmap和使用键值

我的散列表的LatLng作为Key和一个Marker作为Object,当我在迭代过程中得到密钥并将它传递给一个新的LatLng时,它工作正常,但是当我尝试使用这个新的LatLng时,我得到一个java.util.ConcurrentModificationException异常。奇怪的是,当我使用的代码没有的AsyncTask

这种情况不会发生在这里是我的代码

class AddCityMarker extends AsyncTask<Integer, Integer, String> { 

    protected String doInBackground(Integer... counter) {   

     //CityMarker cMarker; 
     LatLng marker_loc; 

     List<String> city_markers = new ArrayList<String>(); 
     if(displayed.size() > 0){ 

      Iterator<HashMap.Entry<LatLng, Marker>> myIterator = displayed.entrySet().iterator(); 
      while(myIterator.hasNext()) { 
       //cMarker = new CityMarker(); 
       HashMap.Entry<LatLng, Marker> entry = myIterator.next();      
       marker_loc = entry.getKey(); 

       Log.i("ZOOM", "Key = " + marker_loc + ", Value = " + entry.getValue()); 

       List<Address> addresses = null;      
       try { 
        //This is where I get the error 
        addresses = gcode.getFromLocation(marker_loc.latitude, marker_loc.longitude, 1); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

       if(addresses.size() > 0) { 
        if(!city_markers.contains(addresses.get(0).getLocality())){ 
         city_markers.add(addresses.get(0).getLocality()); 
         //map.addMarker(new MarkerOptions().position(marker_loc).snippet("CITY")); 
        }       
       } 
      }     
     } 


     return null; 
    } 

    protected void onPostExecute(String jsonResult) { 

     try { 

      if(isClubMarkers){ 
       map.clear(); 
       isClubMarkers = false; 
      } 
      displayed.clear(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

gcode.getFromLocation会怎样?你修改了display.entrySet()吗? – IronBCC

+0

不,我不修改PostExecute上的所有execept。我只是使用Key的值在地图上放置标记 – Amanni

+0

“将标记放置在地图上”,它最后修改了displayed.entrySet()。 – IronBCC

回答

1

在Android 1.6到Android蜂窝,异步任务并行模式下运行。这意味着像不同的线程。在你的情况下,有时你可能会多次调用异步任务,他们可能会尝试访问相同的HashMap进行迭代。您可以通过使用“ConcurrentHashMap”而不是HashMap来避免此异常。但正确的方法是确定异步任务是否多次调用,并尝试避免它在那里。如果尝试使用Hashmap进行操作时,也会发生这种情况,即使Async任务的传输方式相同。如果是这种情况,使用线程安全的“ConcurrentHashMap”。