Как я могу сократить свои коды о Stringrequest? - PullRequest
0 голосов
/ 16 июня 2019

У меня есть несколько методов, которые получают данные из скрипта приложения Google, но немного длиннее, чтобы поместить один и тот же код для всех методов.

Например, это мой метод checkIn, но мне нужно создать метод checkOut или UpdateReservation, которые получают фактическую функцию из javascript в Google. Есть способ сократить этот код запроса строки залпа.

Или, по крайней мере, я могу использовать этот тип кодирования или функции с помощью Firebase и намного проще?

private void checkIn() {
                final RequestQueue requestQueue = Volley.newRequestQueue(Reservations.this);
                final StringRequest stringRequest = new StringRequest(Request.Method.POST, "url",
                        new Response.Listener<String>() {
                            @Override
                            public void onResponse(String response) {


                            }

                        },
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {

                            }
                        }
                ) {
                    @Override
                    protected Map<String, String> getParams() {
                        Map<String, String> parmas = new HashMap<>();

                        //here we pass params
                        parmas.put("action","checkIn");

                        return parmas;
                    }
                };
                int socketTimeOut = 50000;// u can change this .. here it is 50 seconds
                RetryPolicy retryPolicy = new DefaultRetryPolicy(socketTimeOut, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
                stringRequest.setRetryPolicy(retryPolicy);
                requestQueue.add(stringRequest);


            }

        });
    }

1 Ответ

0 голосов
/ 17 июня 2019

По сути, вам нужен более компактный способ написания этого куска кода. Я прав?

Вы можете использовать лямбды, чтобы написать слушателей более компактным способом:

 StringRequest request = new StringRequest(Request.Method.POST, "url",
            (response) -> {
                //Handle response
            },
            (error) -> {
                //Handle error
            }) {
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> parmas = new HashMap<>();

            //here we pass params
            parmas.put("action","checkIn");

            return parmas;
        }
    };

Если метод getParams(...) для каждого случая просто добавить ключ action к карте параметров, вы можете создать класс, расширяющий StringRequest с помощью этой функции.

public class CustomStringRequest extends StringRequest {
    private String action;

    public CustomStringRequest(int method, String url, String action, Response.Listener listener, Response.ErrorListener el) {
        super(method, url, listener, el);
        this.action = action;
    }

    @Override
    protected Map<String, String> getParams() {
        Map<String, String> parmas = new HashMap<>();

        //here we pass params
        parmas.put("action", action);

        return parmas;
    }
}

И тогда в каждом методе вы можете написать свой запрос следующим образом:

request = new CustomStringRequest(Request.Method.POST, "url", "checkIn",
     (response) -> {
         //Handle response
     },
     (error) -> {
         //Handle error
     });

Обратите внимание, что действие типа "checkIn" передано в конструктор CustomStringRequest!

Итак, наконец, вы получите что-то вроде этого

private void checkIn() {
    final RequestQueue requestQueue = Volley.newRequestQueue(Reservations.this);
    final StringRequest stringRequest = new CustomStringRequest(Request.Method.POST, "url", "checkIn",
            (response) -> {
                //Handle response
            },
            (error) -> {
                //Handle error
            });
    int socketTimeOut = 50000;// u can change this .. here it is 50 seconds
    RetryPolicy retryPolicy = new DefaultRetryPolicy(socketTimeOut, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
    stringRequest.setRetryPolicy(retryPolicy);
    requestQueue.add(stringRequest);
}
...