开发一个负责所有网络任务的辅助网络类是不错的做法?

Emi*_*Adz 5 android helper android-networking android-async-http

我创建了以下类:

public class AsyncHttpsClientHelper {

public static final int REMOVE_CREDIT_CARD = 1;
public static final int ENABLE_AUTORENEW = 2;
// +10 final ints...

private static AsyncHttpsClientHelper instance = null;
private static Activity activity;
// Some other variables

    private AsyncHttpsClientHelper(Context context) {
        // Initiate variables
    }

    public static AsyncHttpsClientHelper getInstance(Context context) {
        // Guarantees the same instance for this class (Singleton)
    }

    public void performNetworkTask(int networkTaskType, String value)
    {
        switch (networkTaskType)
        {
            case REMOVE_CREDIT_CARD:
            {
                CupsLog.d(TAG, "path: " + Consts.ACCOUNT_REMOVE_CREDIT_CARD_PATH);
                client.post(Consts.ACCOUNT_REMOVE_CREDIT_CARD_PATH , new JsonHttpResponseHandler() {

                 @Override
                 public void onSuccess(JSONObject result) {
                try {
                    CupsLog.d(TAG, Consts.ACCOUNT_REMOVE_CREDIT_CARD_PATH + " -> onSuccess, result: " + result.toString(3));
                    AccountService.getInstance(activity).pullAccountDetailsFromServer();
                    Toast.makeText(activity, "Your credit card was removed", Toast.LENGTH_SHORT).show();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

                 @Override
                 public void onFailure(Throwable arg0) {
                    CupsLog.d(TAG, "commitPaymentToServer -> onFailure");
                     BusProvider.getInstance().post(new DialogChangeEvent(DialogChangeEvent.REMOVE_CREDIT_CARD, "failed"));
                }
        });
        break;
            }
            case ENABLE_AUTORENEW:
            {
                // Do ENABLE_AUTORENEW logic
            }
            // +10 cases goes here...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个类还没有完成,我仍然需要在这里添加另外10个我在应用程序周围执行的其他网络调用.

要运行其中一个网络任务,我运行此行例如:

AsyncHttpsClientHelper.getInstance(this).performNetworkTask(AsyncHttpsClientHelper.COMMIT_COUPON_TO_SERVER, event.getValue());
Run Code Online (Sandbox Code Playgroud)

当任务完成时,我Event使用Square事件Bus工具触发,以对活动/片段布局提交所需的可视更改.

问题:我的老板声称这是一种不好的做法,当我完成它时,这堂课会变得一团糟.更多的是他声称这个类应该是一个愚蠢的类,他知道怎么做是配置AsyncHttpClient对象并返回它,以便我可以使用它并在相关的内部执行https任务Activity.基本上他说https调用本身应该位于Activity类中.我更喜欢这种方式,并认为它使我的活动更清洁,更好阅读.另一方面,他说这种方式更难以调试,而且这个类结合了Controller和View功能的一部分,它不应该这样做.

那么谁是对的?创建这样的类真的是一个坏习惯吗?

kup*_*sef 1

考虑一下迪米特里关于轮换的说法,因为这是事实。切勿对与 UI 有任何连接的对象使用静态引用。它会导致内存泄漏,并且很难调试。

其他问题:

  • 忘记 getInstance(Context c)。(实际上,由于静态上下文引用,您必须编写此内容)
  • 您的 PerformNetworkTask 方法有一个“value”属性,该属性仅在其中一项任务中使用。这很令人困惑,没有人知道“价值”是什么,只有编写这段代码的人知道。如果您需要其他请求的其他参数怎么办?将它们附加为“值”等参数?这会是一团糟。您应该创建一个抽象 Request 类,并为每个请求类型派生一个新类。这样就很容易理解发生了什么,并且也很容易扩展功能。
  • 我猜你的老板是想说你不应该将回调连接到你的助手类中。网络可以由单独的类处理(最好由服务或异步 http 客户端),但回调肯定应该在 Activity 中,因为那是反应发生的地方。对于来自不同活动的请求,您会如何以不同的方式做出反应?对于您的实现,您不能,因为所有回调都是有线的。看一下该库的网站,它有一个关于如何实现此目的的相对较好的示例: http ://loopj.com/android-async-http/#recommended-usage-make-a-static-http-client

并回答您的问题:

我的老板声称这是一种不好的做法,当我完成它时,这堂课会变得一团糟。

是的,它会变得一团糟(并且当您开始添加/修改功能时会变得更糟)。

此外,他声称这个类应该是一个愚蠢的类,他所知道的就是配置 AsyncHttpClient 对象并返回它,以便我可以使用它并在相关 Activity 中执行 https 任务。

应该是愚蠢的。在我看来,你可以保留performNetworkTask方法,但是你需要有回调参数来让调用者做出不同的反应。

public void performNetworkTask(Request request, JsonHttpResponseHandler handler);
Run Code Online (Sandbox Code Playgroud)

你也应该放下int networkTaskType。我的建议是使用抽象 Request 类。但是,如果您喜欢这种方式,那么至少切换到 Enum。

基本上他说 https 调用本身应该位于 Activity 类中。

“Https 调用”可以表示任何意思。我认为他的意思是回调应该由调用者传递。

我更喜欢这种方式,并认为它使我的活动更清晰、更易于阅读。

这样你的 Activity 中的代码肯定会减少,但你只能支持一个 Activity!基本上,您只是将缺少的代码从 Activity 移至此帮助程序类。更不用说以任何方式修改助手都会很痛苦。

另一方面,他说这种方式更难调试,并且这个类结合了控制器和视图功能的一部分,这是它不应该做的。那么谁是对的呢?创建这样的类真的是一种不好的做法吗?

  • 我同意您尝试将视图部分连接到辅助类。
  • 我不知道他所说的“难以调试”是什么意思,所以最好
    问他。
  • 是的,这是一种不好的做法。你应该重构。