首页 > 解决方案 > 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 则不会发生。我试过的:

我已经被这个问题困扰了好几个星期了。请帮帮我。

标签: javaandroidarraylistiteratorasynchttpclient

解决方案


来自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 和删除之前放置日志语句来验证它。


推荐阅读