首页 > 解决方案 > 如何缩短关于 Stringrequest 的代码?

问题描述

我有一些从谷歌应用脚​​本接收数据的方法,但是为所有方法放置相同的代码有点长。

例如,这是我的 checkIn 方法,但我需要创建 checkOut 方法或 UpdateReservation 从谷歌中的 javascript 接收实际函数。有一种方法可以缩短这个 Volley Stringrequestcode。

或者至少我可以将这种编码或功能与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);


            }

        });
    }

标签: javaandroidandroid-volley

解决方案


基本上,您需要一种更紧凑的方式来编写那段代码。我对么?

您可以使用 lambdas 以更紧凑的方式编写侦听器:

 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向 params 映射添加一个键,您可以创建一个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);
}

推荐阅读