我正在尝试执行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()
在内部循环中被调用,但这不是我的情况。这个问题困扰了我好几个星期。请帮帮我。
答案 0 :(得分:4)
来自https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html#remove--:
IllegalStateException
-如果尚未调用下一个方法,或者在上次调用下一个方法之后已经调用了remove方法
您从传递给AsyncHttpClient
的回调中调用iterator.remove()。该客户端在不同的Thread
上执行,并且回调将在主UI Thread
上执行。但是,您不能保证此处的执行顺序。
所以可能在时间上发生的事情是:
1)iterator.next()
(来自while循环)
2)发布触发
3)iterator.next()
(来自while循环)
4)发布触发
5)第一个回调iterator.remove()
6)第二个回调iterator.remove()
您可以尝试通过在调用next之前放置日志语句来进行验证并删除。
答案 1 :(得分:2)
您可以在方法调用自身的地方使用递归。
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) {
}
});
}