2017-09-13 3 views
0

나는 이런 발리 슛을 만듭니다. 내 arraylist의 크기에 따라 한 번 또는 두 번 이상 게시 명령을 수행하려고합니다. 그러나이 코드를 실행하는 것은 volley 명령을 한 번만 실행합니다.발리 요청은 Android에서 한 번만 실행됩니다. Java

다음은 내가 시도한 것입니다.

for(int i = 0; i<listofobjects.size(); i++){ 
    makeRequest(listobjects.get(i)); 
} 


public void makeRequest(Customobject obj){ 

RequestQueue requestQueue = Volley.newRequestQueue(this); 
    String modifiedUrl = MainActivity.URL + "XXXXX"; 
    StringRequest stringRequest = new StringRequest(Request.Method.POST, modifiedUrl, new Response.Listener<String>() { 

     @Override 
     public void onResponse(String response) { 
      Log.v("Response", response); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.v("Error", error.toString()); 
     } 
})}; 

requestQueue.add(stringRequest); 

} 

이 코드는 발리 요청을 한 번만 실행합니다. listofobjects에있는 항목의 수에 따라 어떻게 실행시킬 수 있습니까?

+0

아마도 귀하의 Volley Singleton은 이전에 만든 동일한 URL로 요청을 취소합니다. 응답이 직렬화되도록 변경해야합니다. –

답변

1
// Gloabal variable 
int i = 0; 

호출이 기능

makeRequest(listobjects.get(i)); 

하여 makeRequest 방법은 내가이 방법은 문제를 해결할 것이라고 생각

public void makeRequest(Customobject obj){ 

RequestQueue requestQueue = Volley.newRequestQueue(this); 
    String modifiedUrl = MainActivity.URL + "XXXXX"; 
    StringRequest stringRequest = new StringRequest(Request.Method.POST, modifiedUrl, new Response.Listener<String>() { 

     @Override 
     public void onResponse(String response) { 
      Log.v("Response", response); 
      i++; 
      if(i < listobjects.size()){ 
       // make a recursive function 
       makeRequest(listobjects.get(i)); 
      } else { 
       // Completed 
      } 



     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.v("Error", error.toString()); 
     } 
})}; 

requestQueue.add(stringRequest); 

} 
+0

i ++가 누락되었습니다. –

1

이 시도 :

public void makeRequest(Customobject obj){ 
    boolean status = true; 
    int i=0; 
    do 
    { 
    RequestQueue requestQueue = Volley.newRequestQueue(this); 
     String modifiedUrl = MainActivity.URL + "XXXXX"; 
     StringRequest stringRequest = new StringRequest(Request.Method.POST, modifiedUrl, new Response.Listener<String>() { 

      @Override 
      public void onResponse(String response) { 
       status = true; 
       Log.v("Response", response); 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       status = true; 
       Log.v("Error", error.toString()); 
      } 
    })}; 
    if(status) 
{ 
    requestQueue.add(stringRequest); 
    i++; 
     status =false;   

} 
    }while(i<listofobjects.size()); 

    } 
+0

무한 루프로 끝납니다. 발리 슛은 비동기이며 while 루프는 반복 응답을 기다리지 않는다는 것을 기억하십시오. –

+0

새 코드 변경은 질문에서와 동일합니다. 당신은 while 루프를 위해 리팩토링했습니다. –

+0

예 do while while do while 향상된 몇 가지 작업을 수행했습니다. –

1

재귀 적으로 호출됩니다.

int i = 0; 
makeRequest(listObjects.get(i)); 
public void makeRequest(Customobject obj){ 
RequestQueue requestQueue = Volley.newRequestQueue(this); 
    String modifiedUrl = MainActivity.URL + "XXXXX"; 
    StringRequest stringRequest = new StringRequest(Request.Method.POST, modifiedUrl, new Response.Listener<String>() { 

     @Override 
     public void onResponse(String response) { 
      Log.v("Response", response); 
       if(reposnse==success && i<listobjects.size){ 
        i++; 
        makeRequest(listObjects.get(i)); 
      } 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.v("Error", error.toString()); 
     } 
})}; 

requestQueue.add(stringRequest); 

}