2016-10-05 1 views
0

У меня есть большая проблема с последовательностью запроса волейбола и создание json-массива из первого запроса ответа для второго запроса.Нужна первая реакция запроса на залп, чтобы сделать объект json для второго запроса

это код:

JSONObject imageAddedResponse = new JSONObject(); 
    JSONArray imagesAddedResponse = new JSONArray(); 

public void postImageData(Context applicationContext, String title, String note, ArrayList<ContentData> mImages, String videoPath, final Listeners.APIPostDataListener listener) { 

    //Instantiate the RequestQueue. 
    RequestQueue requestQueue = Volley.newRequestQueue(applicationContext); 

    Settings settings = new Settings(applicationContext); 
    String selectedURL = settings.getChosenUrl(); 
    final String token = settings.getTokenKey(); 
    String url = "http://" + selectedURL + "/databox/api/v1/upload/files"; 
    HashMap<String, String> params = new HashMap<String, String>(); 
    params.put("Authorization", "Bearer " + token); 
    params.put("Content-Disposition", "form-data" + "; charset=utf-8"); 

    //POST data to CMS to get JSONObject back 
    for (int i = 0; i < mImages.size(); i++) { 
     String path = String.valueOf(mImages.get(i).getPath()); 
     File file = new File(path); 
      MultipartRequest request = new MultipartRequest(url, file, Response.class, params, new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        if (listener != null) { 
         listener.onAPIPostData(String.valueOf(response), true); 
        } 
        if (response != null || response != "") { 
         try { 
          imageAddedResponse = new JSONObject(response); 
          JSONObject jsonArraydata = imageAddedResponse.getJSONObject("data"); 
          JSONArray jsonArrayImages = jsonArraydata.getJSONArray("images"); 
          imagesAddedResponse.put(jsonArrayImages); 

         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.e("Volley Request Error", error.toString()); 
        if (listener != null) { 
         listener.onAPIPostData("", false); 
        } 
       } 
      }); 
      requestQueue.add(request); 
    } 

    //POST request to add entity to CMS 
    JSONObject jsonimages = new JSONObject(); 
    JSONArray jsonArrayimages = new JSONArray(); 
    for (int i = 0 ; i < imagesAddedResponse.length() ; i++){ 
     try { 
      JSONObject getObjectValues = imagesAddedResponse.getJSONObject(i); 
      jsonimages.put("id",getObjectValues.getString("id")); 
      jsonimages.put("src",getObjectValues.getString("src")); 
      jsonimages.put("size",getObjectValues.getString("size")); 
      jsonimages.put("baseName",getObjectValues.getString("baseName")); 
      jsonimages.put("type",getObjectValues.getString("type")); 
      jsonimages.put("db_languages_id", "1"); 
      jsonimages.put("title",String.valueOf(mImages.get(i).getTitle()));    
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    JSONObject json = new JSONObject(); 
    JSONArray jsonArray = new JSONArray(); 
    JSONObject finalobject = new JSONObject(); 
    try { 
     json.put("title", title); 
     json.put("description", note); 
     json.put("db_languages_id", "1"); 
     json.put("db_user_id", "3"); 
     jsonArray.put(json); 
     finalobject.put("data", jsonArray); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    String urlFinal = "http://" + selectedURL + "/databox/api/v1/1/entity"; 
    JsonObjectRequest postRequest = new JsonObjectRequest(urlFinal, json, new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      // response 
      if (listener != null) { 
       listener.onAPIPostData(String.valueOf(response), true); 
      } 
     } 
    }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        // TODO Auto-generated method stub 
        if (listener != null) { 
         listener.onAPIPostData("", false); 
        } 
       } 
      } 
    ) { 
     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("Authorization", "Bearer " + token); 
      params.put("Content-Type", "application/json; charset=utf-8"); 
      return params; 
     } 
    }; 
    postRequest.setShouldCache(false); 
    requestQueue.add(postRequest); 
} 

первый запрос пост на CMS и получить некоторую информацию для изображения размещены, а затем мне нужно добавить эти данные к следующему сообщению, чтобы сделать на основе объект на Ответ я получил от первого запроса.

+0

@ Ангад Tiwari это вопрос –

+0

yahh ... gotit ... :-) –

+0

@saeid let я ясно с t его. 1.вы вызываете MultiPartRequest (который, я думаю, является настраиваемым классом, который расширяет Request <>) для каждой загрузки изображения на сервер. 2. После каждого успешного добавления изображения на сервер вы получили ответ с данными imp. 3. вам нужно вызвать JsonObjectRequest после успешной загрузки изображения. Это то, чего вы хотите достичь? –

ответ

0
int totalSuccesfulImagePost = 0; //this variable increment when each succesful response from multipart-request 

public void postImageData(Context applicationContext, String title, String note, ArrayList<ContentData> mImages, String videoPath, final Listeners.APIPostDataListener listener) { 

     //Instantiate the RequestQueue. 
     RequestQueue requestQueue = Volley.newRequestQueue(applicationContext); 

     Settings settings = new Settings(applicationContext); 
     String selectedURL = settings.getChosenUrl(); 
     final String token = settings.getTokenKey(); 
     String url = "http://" + selectedURL + "/databox/api/v1/upload/files"; 
     HashMap<String, String> params = new HashMap<String, String>(); 
     params.put("Authorization", "Bearer " + token); 
     params.put("Content-Disposition", "form-data" + "; charset=utf-8"); 

     //POST data to CMS to get JSONObject back 
     for (int i = 0; i < mImages.size(); i++) { 
      String path = String.valueOf(mImages.get(i).getPath()); 
      File file = new File(path); 
      MultipartRequest request = new MultipartRequest(url, file, Response.class, params, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       if (listener != null) { 
        listener.onAPIPostData(String.valueOf(response), true); 
       } 
       if (response != null || response != "") { 
        try { 
         imageAddedResponse = new JSONObject(response); 
         JSONObject jsonArraydata = imageAddedResponse.getJSONObject("data"); 
         JSONArray jsonArrayImages = jsonArraydata.getJSONArray("images"); 
         imagesAddedResponse.put(jsonArrayImages.getJSONObject(0)); 
         totalSuccesfulImagePost++; //here we increase the count 
         postRequest(token); //call this method and check wheather all the image uploaded or not 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.e("Volley Request Error", error.toString()); 
       if (listener != null) { 
        listener.onAPIPostData("", false); 
       } 
      } 
     }); 
     requestQueue.add(request); 
    } 
} 

//make this as seperate method and call when all multipart-request call succesful 
public void postRequest(String token){ 

    if(totalSuccesfulImagePost != mImages.size()) { 
     //this means not all the images posted yet, hence return the method 
     return; 
    } 

    //POST request to add entity to CMS 
    JSONObject jsonimages = new JSONObject(); 
    JSONArray jsonArrayimages = new JSONArray(); 
    for (int i = 0 ; i < imagesAddedResponse.length() ; i++){ 
     try { 
     JSONObject getObjectValues = imagesAddedResponse.getJSONObject(i); 
     jsonimages.put("id",getObjectValues.getString("id")); 
     jsonimages.put("src",getObjectValues.getString("src")); 
     jsonimages.put("size",getObjectValues.getString("size")); 
      jsonimages.put("baseName",getObjectValues.getString("baseName")); 
      jsonimages.put("type",getObjectValues.getString("type")); 
      jsonimages.put("db_languages_id", "1"); 
      jsonimages.put("title",String.valueOf(mImages.get(i).getTitle()));    
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    JSONObject json = new JSONObject(); 
    JSONArray jsonArray = new JSONArray(); 
    JSONObject finalobject = new JSONObject(); 
    try { 
     json.put("title", title); 
     json.put("description", note); 
     json.put("db_languages_id", "1"); 
     json.put("db_user_id", "3"); 
     jsonArray.put(json); 
     finalobject.put("data", jsonArray); 
    } catch (JSONException e) { 
     e.printStackTrace();.getJSONObject(0) 
    } 
    String urlFinal = "http://" + selectedURL + "/databox/api/v1/1/entity"; 
    JsonObjectRequest postRequest = new JsonObjectRequest(urlFinal, json, new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      // response 
      if (listener != null) { 
       listener.onAPIPostData(String.valueOf(response), true); 
      } 
     } 
    }, 
     new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       // TODO Auto-generated method stub 
       if (listener != null) { 
        listener.onAPIPostData("", false); 
       } 
      } 
     } 
) { 
    @Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
     Map<String, String> params = new HashMap<String, String>(); 
     params.put("Authorization", "Bearer " + token); 
     params.put("Content-Type", "application/json; charset=utf-8"); 
     return params; 
    } 
}; 
    postRequest.setShouldCache(false); 
    requestQueue.add(postRequest); 
} 

обновил свой код. Надеюсь, это может вам помочь.

  1. Я создал новый метод для JsonObjectRequest с именем postRequest();
  2. totalSuccesfulImagePost переменная содержит значение no. от успешного ответа на загрузку изображений
  3. нового метод postRequest() вызывает у каждого ответа многочастному-запрос
  4. postRequest() метода проверка, если не весь процесс ответа еще, чем пропустить 2-й апите вызов

Также увидеть, как фб сделать эту партию просьбу об https://developers.facebook.com/docs/android/graph/ -> Batch Reqest

Примечания -

  1. Ive увеличивает переменную totalSuccesfulImagePost и обрабатывать в каждом ответ, хотя вы должны Response.ErrorListener()

  2. Хотя вы можете пойти с опцией ThreadPoolExecutor, где каждый поток создается для обработки каждых загрузок многочастному-запроса и после все выполнение потока, вызовите метод postRequest()

работы вокруг использования ThreadPoolExecutor

а) Создать ThreadPoolExecutor & инициализировать размер мин/макс бассейн

б) Asign каждого mulitpart-запрос, чтобы загрузить изображения для каждого потока

с) Добавить все нити (содержит изображение загрузить многослойный-запрос) к ThreadPoolExecutor

г) Выполнить бассейн

е) вызов метода postRequest(), когда ThreadPoolExecutor пуст, то есть это означает, что все выполнение потока выполнено и готово к вызову postRequest()

0

можно использовать Приоритет каждого запроса.

private Priority priority = Priority.HIGH; 

StringRequest strReq = new StringRequest(Method.GET, 
      Const.URL_STRING_REQ, new Response.Listener<String>() { 

       @Override 
       public void onResponse(String response) { 
        Log.d(TAG, response.toString()); 
        msgResponse.setText(response.toString()); 
        hideProgressDialog(); 

       } 
      }, new Response.ErrorListener() { 

       @Override 
       public void onErrorResponse(VolleyError error) { 
        VolleyLog.d(TAG, "Error: " + error.getMessage()); 
        hideProgressDialog(); 
       } 
      }) { 
     @Override 
     public Priority getPriority() { 
      return priority; 
     } 

    }; 

    MyApplication.getInstance().addToRequestQueue(strReq); 
+0

спасибо за ответ @sathish gadde ... не могли бы вы объяснить это немного больше, это пока не помогло мне –

Смежные вопросы