AsyncHttpClient 中的 ArrayList iterator.remove() 抛出 IllegalStateException
ArrayList iterator.remove() inside AsyncHttpClient throws 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.remove()
之前调用iterator.next()
造成的。我有它,但我的代码仍然无法正常工作。另一个常见原因是 iterator.remove()
是在内循环中调用的,但我的情况不是这样。
几周来我一直被这个问题困扰。请帮帮我。
来自https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html#remove--:
IllegalStateException
- 如果next方法还没有被调用,或者remove方法在上次调用next方法后已经被调用了
您从传递给 AsyncHttpClient
的回调调用 iterator.remove()。该客户端在不同的 Thread
上执行,回调将在主 UI Thread
上执行。但是,您无法保证此处的执行顺序。
所以时间上可能发生的事情是:
1) iterator.next()
(来自 while 循环)
2) post 触发
3) iterator.next()
(来自 while 循环)
4) post 触发
5)第一次回调iterator.remove()
6) 第二次回调iterator.remove()
您可以尝试通过在调用 next 和 remove 之前放置日志语句来验证它。
您可以在方法调用自身的地方使用递归。
ArrayList<String> testArrayList = new ArrayList<>();
testArrayList.add("Item 1");
testArrayList.add("Item 2");
void submitItem(ArrayList<String> items){
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) {
items.remove(0);
Toast.makeText(context, "Removing..", Toast.LENGTH_SHORT).show();
if(ites.size() > 0) submitItem(items);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
}
});
}
我正在尝试使用 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.remove()
之前调用iterator.next()
造成的。我有它,但我的代码仍然无法正常工作。另一个常见原因是iterator.remove()
是在内循环中调用的,但我的情况不是这样。
几周来我一直被这个问题困扰。请帮帮我。
来自https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html#remove--:
IllegalStateException
- 如果next方法还没有被调用,或者remove方法在上次调用next方法后已经被调用了
您从传递给 AsyncHttpClient
的回调调用 iterator.remove()。该客户端在不同的 Thread
上执行,回调将在主 UI Thread
上执行。但是,您无法保证此处的执行顺序。
所以时间上可能发生的事情是:
1) iterator.next()
(来自 while 循环)
2) post 触发
3) iterator.next()
(来自 while 循环)
4) post 触发
5)第一次回调iterator.remove()
6) 第二次回调iterator.remove()
您可以尝试通过在调用 next 和 remove 之前放置日志语句来验证它。
您可以在方法调用自身的地方使用递归。
ArrayList<String> testArrayList = new ArrayList<>();
testArrayList.add("Item 1");
testArrayList.add("Item 2");
void submitItem(ArrayList<String> items){
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) {
items.remove(0);
Toast.makeText(context, "Removing..", Toast.LENGTH_SHORT).show();
if(ites.size() > 0) submitItem(items);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
}
});
}