Zmienna resetuje się po wyjściu z bloku try{}

0

Witam. Podczas pisania fragmentu kogu mającego wysyłać zapytania GET i zapisania odpowiedzi Json jako listę obiektów natknąłem się na dziwny i nie zrozumiały dla mnie problem, a właściwie dwa.

  1. IDE wymusza na mnie deklaracji <List> lista z użyciem final,
  2. W bloku try{} zapisuje do<List> lista kolejne obiekty stworzone na podstawie odpowiedzi JSON i w debugerze widzę że wszystko jest ok, lista po zakończeniu pętli for ma 5 elementów, tak jako powinna mieć, ale na końcu metody , kiedy listę chcę zwrócić okazuje się że lista ma 0 elementów. Pewnie problem spowodowany jest tym że działania te wykonuje w metodzie onResponse() ale wydawało mi się zadeklarowanie listy poza nią wystarczy. Jak można naprawić ten problem?
  List<Expens> get_all_expensions(){
         final List<Expens> lista = new ArrayList<Expens>();

        // Instantiate the RequestQueue.
        RequestQueue queue = Volley.newRequestQueue(this);
        String url ="http://przyklady.javastart.pl/ap/expenses/";
// Request a string response from the provided URL.
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Gson gson = new Gson();

                        try
                        {
                            JSONArray JA = new JSONArray(response);
                            int b = JA.length();
                            for(int i=0; i<JA.length();i++){

                                lista.add(gson.fromJson(JA.getString(i),Expens.class));
                            }

                        }

                        catch (JSONException e)
                        {
                            e.printStackTrace();
                        }
                        catch (Exception e)
                        {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });
// Add the request to the RequestQueue.
        queue.add(stringRequest);
        return lista;
    }
0

Nic Ci się nie resetuje. Po prostu volley requesty sa nieblokujace. Czyli robisz request, ale twój wątek nie czeka na odpowiedź, twój wątek idzie dalej i zwraca pusą listę. A gdzies po tem, przychodzi response z serwera i wstawia coś do tej listy - ale jest to za późno...
To, co chcesz pewnie zrobić, to przyblokowac się w metodzie, aż przyjdzie odpowiedź z serwera.
jak to zrobić, jest tutaj:
https://stackoverflow.com/questions/17608707/volley-http-request-in-blocking-way

A może, dasz radę tak przepisać program aby nie blokować?
Bo, jak mówi stare rumuńskie przysłowie:
Kto wątek blokuje, ten jest strasznym programistą.

0 użytkowników online, w tym zalogowanych: 0, gości: 0