2013-08-12 135 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」。