如何防止Android中的代码重复

时间:2018-08-18 10:32:21

标签: java android oop android-volley

我是android和OOP的新手。我知道Fowler难闻的气味之一是代码重复。在我的整个项目中,我从事不同活动的排球请求大约有25个,而所有这些请求中都有90%的相同代码。

看看这个伪代码:

on Error:
    if no connection:
        Toast "no connection"
    else if no response:
        Toast "server error"
    else
        show popup with a retry button which will call the function which this request is inside it again.

我的第一个问题是如何在一个地方写这些,并在不同地方使用整个请求对象。

我的第二个问题是某些特殊活动中有一些与活动相关的代码。例如,在我的登录页面上,我没有未经授权错误,但在其他页面上却有。或者如您所见,在上述代码的最后一个 else 中,我说过要调用该函数,如果每个请求都不同。我该如何处理?

我该怎么做? 有什么特别的参考吗? tnx

2 个答案:

答案 0 :(得分:0)

不要将代码重复,而是将代码放在函数中(带或不带参数,取决于您的任务要求),然后在程序中所需的位置调用它。

如果您不知道如何在Android或Java中创建函数,请点击此链接 http://www.learnjavaonline.org/en/Functions

答案 1 :(得分:0)

您可以创建一个util类来创建请求。 例如,这是一个能够使用JSONObject创建GET请求的类,该请求在出错时显示Toast消息,并在成功时执行作为参数传递的功能:

public class VolleyUtils{


public static JsonObjectRequest createGetRequest(String url, Consumer<? super JSONObject> successCallback){

    return new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            successCallback.consume(response)
        }

    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            if (volleyError instanceof TimeoutError || volleyError instanceof NoConnectionError) {
                VolleyUtils.showToast("No Internet connection");
            } else if (volleyError instanceof AuthFailureError) {
                VolleyUtils.showToast("Bad authentication");
            } else if (volleyError instanceof ServerError) {
                VolleyUtils.showToast("Error with server");
            } else if (volleyError instanceof NetworkError) {
                VolleyUtils.showToast("Network error");
            } else if (volleyError instanceof ParseError) {
                VolleyUtils.showToast("Parsing Error");
            }
        }
    });

}


private static void showToast(String errorText){
    Toast.makeText(getApplicationContext(), errorText, Toast.LENGTH_SHORT).show();
}

}

因此,要创建一个新请求,只需执行以下操作:

//supposing you get the RequestQueue with Singleton Pattern
MySingleton.getInstance().addToRequestQueue(VolleyUtils.createGetRequest("www.google.com", (JSONObject response) -> { 
        //stuff to do when request has success, for example :
        myTextView.setText(response.toString())

    } ));