繁体   English   中英

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.next()之前iterator.remove() 我已经有了,但是我的代码仍然无法正常工作。 另一个常见的原因是在内部循环中调用了iterator.remove() ,但这不是我的情况。

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

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

您可以在方法调用自身的地方使用递归。

 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) {

            }
        });

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM