ArrayList Iterator.remove () dentro AsyncHttpClient lanza IllegalStateException

tyn:

Estoy tratando de hacer HttpClient POST para enviar cada elemento de un ArrayList uno por uno para el servidor. Éstos son algunos fragmentos de mis códigos:

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

            }
        });
    }

El problema es iterator.remove()siempre tirar IllegalStateException. Esto no sucede si AsyncHttpClient no está involucrado. Lo que he intentado:

  • He intentado poner iterator.next()dentro onSuccess()(sin RequestParamsagregado en este caso, sólo para probarlo) pero causa la aplicación atascado y no responde. (En mi caso, yo en realidad le gustaría mantener fuera onSuccess()porque desde el iterador es donde voy a recuperar mi RequestParams)
  • He buscado preguntas similares. La mayoría de los problemas son causados por no haber llamado iterator.next()antes iterator.remove(). Lo tengo, pero mi código todavía no está funcionando. Otra causa frecuente sería la iterator.remove()que se llama dentro de un bucle interno, pero ese no es mi caso.

He estado atascado en este problema durante semanas. Por favor, ayúdame.

Ramees Thattarath:

Puede hacer uso de una recursividad, donde el método llama a sí misma.

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

            }
        });

}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=120022&siteId=1
Recomendado
Clasificación