2014-10-27 5 views
11

Chciałbym złożyć wniosek za pomocą Biblioteki Salwatorian w różnych wątkach.Utwórz zamówienie na siatkę w innym wątku

To znaczy, że istnieje połączenie, które jest w Bieżniku i proces danych w UIThread. Chcę to zrobić, ponieważ mam dużo połączenia, więc wiele danych do przetworzenia i dziś mam interfejs użytkownika, który jest blokiem.

Więc, jak mogę zrobić, aby umieścić i uruchomić połączenie w inny wątek, i zrobić OnResponse()/OnErrorResponse() w 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); 

     } 
    }); 
+0

Nikt nie może odpowiedzieć ?? :/ –

Odpowiedz

16

każde żądanie sieciowej wykonanej przez Volley odbywa się w wątku tła. Volley zajmuje się tym za kulisami. Nie ma więc potrzeby wykonywania żądania w innym wątku, ponieważ to już się dzieje.

Z kolei słuchacze są wzywani do wątku interfejsu użytkownika.

W zasadzie odpowiedziałeś na własne pytanie, gdy napisałeś, że dane są przetwarzane w wątku UI. Po prostu przenieś przetwarzanie danych, które wykonywane jest wewnątrz urządzeń słuchających, do wątku tła/AsyncTask, aby zwolnić wątek interfejsu użytkownika i zapobiec blokowaniu.

+0

Rozwiązuję mój problem inną metodą. Widziałem, że OnResponse działa na wątku UI i prośbie w drugim wątku, tak jak powiedziałeś. Ale używając metody parseNetworkResponse (odpowiedź NetworkResponse), która działa na innym wątku, mogę przetwarzać dane procesowe w tej metodzie, więc w drugim wątku i po prostu uruchomić prograsseBar w odpowiedzi. W tym przypadku UiTHread nie jest blokowy. Po tym nie wiem, czy to dobra metoda, co o tym sądzisz? –

+0

Nie jestem pewien, czy zrozumiałem dokładnie, ale wygląda na to, że przeniosłeś przetwarzanie danych do innego wątku, jak sugerowałem. Jeśli tak jest, to jestem szczęśliwy, że zadziałało. –

+0

okok, tak w tej chwili, to działa, nie pytam więcej =) –