Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make Volley request in different thread

I would like to make a request using the Android Volley library in a different thread.

What I mean is, there is the connection which is in the thread and the data is processed in the UI thread.

I want to do this because I have a lot of connections, a lot of data to process, and right now the user interface is blocked.

So, how do I create and start the connection in a different Thread, and do then OnResponse()/OnErrorResponse() in the UIThread?

JsonArrayRequest getReq = new JsonArrayRequest(url,new Response.Listener<JSONArray>() {

    @Override
    public void onResponse(JSONArray response) {
        Log.d("onRESPONSE Synchro -> Produit",response.toString());                                 
        PgrBarProducts.setMax(response.length());       
        percentDisplayProduct.setText("0/"+ PgrBarProducts.getMax());
        nbMaxCallNetwork = PgrBarProducts.getMax();
        try {
            for (int i = 0; i < response.length(); i++) {                                           
                JSONObject explrObject = response.getJSONObject(i);
                String id = Integer.toString((Integer) explrObject.get("id")); 

                callOneObject(id, PgrBarProducts, percentDisplayProduct , 1); // appel du product
             }
        } catch (JSONException e) {
            e.printStackTrace(new PrintWriter(stackTrace));
        }                           
    }
 }, new Response.ErrorListener() {
     @Override
     public void onErrorResponse(VolleyError error) {
         changeStatutToError();
         VolleyLog.d("", "Error: " + error.getMessage());
         percentDisplayProduct.setTextColor(Color.RED);
         percentDisplayProduct.setTypeface(null, Typeface.BOLD);
         percentDisplayProduct.setText("erreur");


         waitBarProgressProduct.setVisibility(View.INVISIBLE);
         synchroProducts.setVisibility(View.VISIBLE);
     }
});

getReq.setRetryPolicy(new DefaultRetryPolicy(60 * 1000, 
    1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));               
// Adding request to request queue and start the request        
AppController.getInstance().addToAndStartRequestQueue(getReq);

like image 284
Thomas Trabelsi Avatar asked Oct 27 '14 12:10

Thomas Trabelsi


1 Answers

Every network request performed by Volley is performed in a background thread. Volley takes care of this behind the scenes. So there is no need to perform a request on a different thread, since that's already happening.

The listeners, on the other hand, are called on the UI thread.

You basically answered your own question when you wrote that the data is processed on the UI thread. Simply move that data processing that is performed inside your listeners to a background thread / AsyncTask to free your UI thread and prevent the blocking.

like image 130
Itai Hanski Avatar answered Oct 19 '22 21:10

Itai Hanski