【问题标题】:how to prevent code duplication in android如何防止android中的代码重复
【发布时间】:2019-01-25 05:16:37
【问题描述】:

我是 android 和 OOP 的新手。我知道 Fowler 的坏习惯之一是代码重复。我在不同活动的整个项目中有大约 25 个 volley 请求,在所有这些项目中,有 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.

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

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

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

【问题讨论】:

  • 如果仅此而已,则无需更改。
  • 我认为上面代码中的大“气味”会在您每次使用时重复所有弹出代码。也许您可以将其移至常用的辅助方法。老实说,你的 Android 代码可能有一些样板。
  • @greenapps 我的问题是,起初我使用弹出窗口没有连接错误,但后来我决定显示 toast,这让我更改了 20 25 个代码。所以我想我可能会改变一些设计。
  • @TimBiegeleisen 我正在使用 android 内置弹出窗口,我认为我没有简单的方法来使用它们。如果有的话,我将不胜感激。

标签: java android oop android-volley


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以创建一个实用程序类来创建请求。 例如,这是一个能够使用 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())
    
        } ));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      相关资源
      最近更新 更多