Ошибка параметров запроса POST для Android-залпа при использовании проанализированной переменной - PullRequest
0 голосов
/ 06 сентября 2018

// Код

private void searchQuery(String strQuery, String link){
        Toast.makeText(getContext(), "You searched for "+strQuery, Toast.LENGTH_SHORT).show();

        JsonArrayRequest request = new JsonArrayRequest(Request.Method.POST, link, new Response.Listener<JSONArray>(){
            @Override
            public void onResponse(JSONArray jresponse) {
                //displayResultInList(jresponse);
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                }
            }) {
            @Override
            protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {
                Map<String, String> parameters = new HashMap<String, String>();
                parameters.put("query", strQuery);
                return parameters;
            }
        };

        RequestQueue rQueue = Volley.newRequestQueue(getActivity());
        rQueue.add(request);

    }

Эта конкретная строка: parameters.put ("query", strQuery); выдает ошибку и сообщение об ошибке говорит: Переменная 'strQuery' доступна из внутреннего класса и должна быть объявлена ​​как final. Я провел некоторое исследование и прочитал некоторые учебники по запросам POST, используя Volley, и большая их часть использует не переменные, а строки в этой функции. Проблема с установкой переменной в качестве окончательной заключается в том, что пользователь печатает ее, поэтому эта переменная будет только иметь значение после отправки запроса.

1 Ответ

0 голосов
/ 06 сентября 2018

Это потому, что вы используете переменную параметра в блоке кода внутри метода.

Компилятор JAVA требует, чтобы переменные из вне области действия блока Response.Listener были объявлены как окончательные, чтобы гарантировать, что значение переменной остается тем же (когда блок объявлен) при выполнении кода .

Это гарантирует, что вы не сможете изменить значение переменной после объявления блока.

Итак, вам НУЖНО поместить final перед String strQuery в параметре функции, поскольку вы используете его внутри блока.

...