java - AsyncHttpClient 中的 ArrayList iterator.remove() 抛出 IllegalStateException
问题描述
我正在尝试执行 HttpClient POST 以将 ArrayList 的每个项目一一提交给服务器。以下是我的一些代码片段:
ArrayList<String> testArrayList = new ArrayList<>();
testArrayList.add("Item 1");
testArrayList.add("Item 2");
final Iterator<String> iterator = testArrayList.iterator();
while(iterator.hasNext()){
for(int i = 0; i<testArrayList.size(); i++){
currentContent += "| " + testArrayList.get(i) + " | ";
}
currentItem = iterator.next();
final String url = "some url here"
RequestParams params = new RequestParams();
params.add("item_name", currentItem);
new AsyncHttpClient().post(url, params, new AsyncHttpResponseHandler( {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
Toast.makeText(context, "Removing..", Toast.LENGTH_SHORT).show();
iterator.remove();
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
}
});
}
问题是iterator.remove()
总是会抛出 IllegalStateException。如果不涉及 AsyncHttpClient 则不会发生。我试过的:
- 我试过放入
iterator.next()
(在这种情况下onSuccess()
没有RequestParams
添加,只是为了尝试一下),但它会导致应用程序卡住并且没有响应。(在我的情况下,我实际上想把它放在外面onSuccess()
,因为我将从迭代器中检索我的RequestParams
) - 我已经搜索过类似的问题。大多数问题是由于没有调用
iterator.next()
之前引起的iterator.remove()
。我有它,但我的代码仍然无法正常工作。另一个常见的原因iterator.remove()
是在内部循环中被调用,但这不是我的情况。
我已经被这个问题困扰了好几个星期了。请帮帮我。
解决方案
来自https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html#remove--:
IllegalStateException
- 如果下一个方法还没有被调用,或者在最后一次调用下一个方法之后已经调用了 remove 方法
您从传递给的回调中调用 iterator.remove() AsyncHttpClient
。该客户端在不同的地方执行Thread
,回调将在主 UI 上执行Thread
。但是,您无法保证此处的执行顺序。
所以时间上可能发生的事情是:
1)iterator.next()
(来自while循环)
2)后触发
3)iterator.next()
(来自while循环)
4)后触发
5)第一个回调iterator.remove()
6)第二个回调iterator.remove()
您可以尝试通过在调用 next 和删除之前放置日志语句来验证它。
推荐阅读
- java - java.lang.VerifyError:部署war文件导致的局部变量类型错误
- google-chrome-extension - 如何编辑 _generated_background_page.html 页面?
- angular - 如何在 AppComponent 以外的另一个组件中使用从共享模块导入的角度组件
- c# - 在 EF Core 上下文中设置 UseDatabaseNullSemantics = true
- javascript - 在调用通过相同函数显示计时器的 JavaScript 函数之前清除标签 [会话超时]
- python - 如何在 HTML 生成的 PDF 文件的所有页面中生成页眉和页脚?
- python - NameError:在循环内使用 functools 部分时
- gitlab - 如何将多个应用程序部署到单个 Gitlab 托管集群?
- select - SAS 随机抽样,具有组大小
- java - 在 courses2 中搜索课程“Java 101”并打印出该课程在 List 中的索引