2014-08-27 95 views
1

我想迭代一個名爲localWifiList的ArrayList,它包含wifi掃描檢測到的wifi網絡。 對於ArrayList的每個元素,我想運行一個查詢來獲取具有該特定mac地址的數據庫中的所有元組,創建一個新對象並將此對象添加到名爲wifiFromDatabase的新arrayList中。 我寫這段代碼:`ConcurrentModificationException當我在ArrayList上迭代

ArrayList<wifiList> wifiFromDatabase = new ArrayList<wifiList>(); 
    ArrayList<wifiList> localWifiList = ScanService.wifiArraList; 


    //field to read the values of wifi query results 
    String mac; 
    String ssid; 
    String cid; 
    String signalLevel; 
    String capabilities; 
    String rssi; 
    String lat, lng; 
    String date; 
    String frequency; 
    int flagInt; 

    Cursor cursor; 


    Iterator<wifiList> iterator = localWifiList.iterator(); 
    while(iterator.hasNext()){ 

     wifiList element = (wifiList) iterator.next(); 

     cursor = MainActivity.getDBOperationHelper().getWifiTupleByMac 
       (MainActivity.getDBOperationHelper().getReadableDatabase(), element.getMacAddress()); 

     if(cursor.getCount()>0){ 

      if (cursor .moveToFirst()) { 

       while (cursor.isAfterLast() == false) { 
        mac = cursor.getString(cursor.getColumnIndex(DBOperationHelper.MAC));// 
        ssid = cursor.getString(cursor.getColumnIndex(DBOperationHelper.SSID));// 
        capabilities = cursor.getString(cursor.getColumnIndex(DBOperationHelper.CAPABILITIES));// 
        frequency = cursor.getString(cursor.getColumnIndex(DBOperationHelper.FREQUENCY));// 
        cid = cursor.getString(cursor.getColumnIndex(DBOperationHelper.CELL_ID_UMTS));// 
        signalLevel = cursor.getString(cursor.getColumnIndex(DBOperationHelper.SIGNAL_LEVEL_WIFI));// 
        rssi = cursor.getString(cursor.getColumnIndex(DBOperationHelper.RSSI)); 
        lat = cursor.getString(cursor.getColumnIndex(DBOperationHelper.GPS_LATITUDE_WIFI));// 
        lng = cursor.getString(cursor.getColumnIndex(DBOperationHelper.GPS_LONGITUDE_WIFI));// 
        date = cursor.getString(cursor.getColumnIndex(DBOperationHelper.DATE_WIFI));// 
        flagInt = cursor.getInt(cursor.getColumnIndex(DBOperationHelper.FLAG)); 



        wifiList objectFromDb = WifiPhoneConfiguredNetworkHandler.CreateProperlyWifiListObject(ssid, capabilities, frequency, signalLevel, ConnectionPointAnalyzer.INVALID_ID_WIFI, signalLevel, 
          mac, rssi, date, cid, lat, lng, flagInt, false); 

        wifiFromDatabase.add(objectFromDb); 

        cursor.moveToNext(); 
       } 
      } 

     }else{ //the database has not tuples with this mac 

      Log.d(ConnectionPointAnalyzer.LOG_TAG, "OracoloBrain.java/AllInterfacesActived: no tuples found in the db with mac = "+element.getMacAddress()+ 
        " ssid = "+element.getSsid()); 
     } 

    } ` 

,其中方法CreateProperlyWifiListObject創建作爲參數傳遞領域的wifiList對象。 我讀了很多關於這個問題的線索,但沒有做任何事情。我也試着在arrayList上同步。 iterator.next()命令拋出異常。

+0

是填充代碼'localWifiList'來自同一個線程調用? – 2014-08-27 09:09:35

+1

某些therad可能會在您迭代它時修改localWifiList。因此例外。一個解決方案是製作localWifiList的本地副本並迭代副本。 – Stefan 2014-08-27 09:12:04

+0

localWifiList用另一個類(Service類)中的ScanService.wifiArraList填充。 ScanService類中的no上面的代碼引發了異常。在填充ScanService類中的本地數組列表後,我不使用線程,我調用上面的方法。 – 2014-08-27 09:15:47

回答

1

嘗試創建一個副本:

ArrayList<wifiList> localWifiList = new ArrayList<wifiList>(ScanService.wifiArraList); 
+0

你是對的,我很愚蠢,我確信要做一個副本,但ArrayList localWifiList = ScanService.wifiArraList不會使它。謝謝,現在它可以工作 – 2014-08-27 09:30:09

相關問題