0

我当前从 web 服务检索数据的代码如下:

try{
    for(int i = 0; i <= list.size() - 1; i++){
        SoapObject request = new SoapObject(NAMESPACE + "/", "get_all");    
        request.addProperty("host", host);
        request.addProperty("user", user);
        request.addProperty("pass", pass);
        request.addProperty("bd", bd);              
        request.addProperty("id", list.get(i));

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL, 60000);
        try {
            androidHttpTransport.call(URL + "/get_all", envelope);
        } catch (Exception e) {
            Log.e("Error HH:", e.toString());
            break;
        }

        SoapObject rep = (SoapObject) envelope.bodyIn;
        JSONArray jr = new JSONArray(rep.getPropertyAsString(0)); 

        JSONObject jb = (JSONObject) jr.get(0); 
        db.update_text(jb.getString("text_priority"), jb.getInt("id"));
        updateLabel("Importing id: " + jb.getString("id"));
        publishProgress((i * 100) / list.size()); 
    }
}catch (Exception e) {
    Log.e("Error H:", e.toString());
}

它在标签中正确显示以下内容:

“导入id:1”

“导入id:2”

“导入id:3”

“导入id:4”

“导入id:5”

“导入id:6”

它工作正常。虽然,只要调用完美完成,我想删除变量“list”中的 ID。

try {
    androidHttpTransport.call(URL + "/get_all", envelope);
    list.remove(list.get(i));
} catch (Exception e) {
    Log.e("Error HH:", e.toString());
    break;
}

但是,使用此代码,我的标签输出如下:

“导入id:1”

“导入id:3”

“导入id:5”

“导入id:7”

我也试过这个:

try {
    androidHttpTransport.call(URL + "/get_all", envelope);
    list.remove(i);
} catch (Exception e) {
    Log.e("Error HH:", e.toString());
    break;
}

但是我得到了相同的结果,谁能告诉我为什么?谢谢。

4

1 回答 1

2

您需要从列表中的最后一项开始,如果要在迭代它们的同时删除项目,则需要向后工作。因此,将您的 for 循环更改为:

for(int i = list.size()-1; i >= 0; i--)

由于在从数组中删除项目时将所有内容都向左移动,因此您要确保光标也沿相同方向移动。因此,如果我们有一个包含 4 个项目的数组并且正在查看第 0 个位置的项目:

[itemA itemB itemC itemD] (i=0)
 ^

然后删除该项目并增加我们的计数器:

[itemB itemC itemD] (i=1)
         ^

我们直接跳过了项目B,直接去了项目C!但是从后到前:

[itemA itemB itemC itemD] (i = 3)
                      ^

并删除:

[itemA itemB itemC] (i=2)
               ^

我们没有错过任何东西。

于 2013-11-07T12:00:48.473 回答