我在 mLogger.info(items.toString())下面的代码中使用 JSONArray 时得到 ConcurrentModificationException :
public static void removeItems(long id, String mode) {
for (int i = 0; i < items.length(); ++i) {
try {
if (items.getJSONObject(i).getLong(ID) == id) {
items.remove(i);
break;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
mLogger.info(items.toString());
}
此处项目是JSONArray。当执行下面的代码时出现错误:
atal Exception: java.util.ConcurrentModificationException
at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
at org.json.JSONArray.writeTo(JSONArray.java:601)
at org.json.JSONArray.toString(JSONArray.java:574)
at com.example.test.Utility.removeItems(Utility.java:532)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:149)
at android.app.ActivityThread.main(ActivityThread.java:5061)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(NativeStart.java)
有没有办法让JSONArray并发?我必须使用JSONArray ......
答案 0 :(得分:1)
首先,您可以将JSONArray转换为List,然后再转换为List
只需使用Iterator
删除项目,而您正在遍历列表
Iterator<JsonObject> it = convertedItemList.iterator();
while (it.hasNext()) {
JSONObject jsonObject = it.next();
if (jsonObject.getLong(ID) == id) {
it.remove();
}
}
之后,如果需要,可以将其转换回JSONArray。
答案 1 :(得分:0)
创建新的JSONArray添加所需的对象。
JSONArray newArray = new JSONArray();
JSONArray jsonArray = actualData;
for (Object obj : jsonArray) {
JSONObject jobj = (JSONObject) obj;
if (id.equalsIgnoreCase(jobj.get("id").toString())) {
// Do nothing
} else {
//add to new array
newArray.add(obj);
}
}