当我迭代ArrayList时出现ConcurrentModificationException

时间:2014-08-27 09:05:40

标签: java android exception arraylist concurrentmodification

我想迭代一个名为localWifiList的ArrayList,它包含wifi扫描检测到的wifi网络。 对于ArrayList的每个元素,我想运行查询以获取具有该特定mac地址的数据库中的所有元组,创建一个新对象并将此对象添加到名为wifiFromDatabase的新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上的synchronized。 iterator.next()命令抛出异常。

1 个答案:

答案 0 :(得分:1)

尝试创建副本:

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