java - 如何有效地使用事件总线?

标签 java android design-patterns otto

现在我正在探索 Android 学习项目的一些选项。 我正在尝试与我的 Rails api 进行通信(也是一个学习项目)。

经过一些研究,我想我已经确定了一个使用 retrofit 和 otto 的方案。

我最终得到的是这个。 当我想调用我的 Rails 服务器(在本例中是为了注册)时,我会在 Activity 中执行此操作。

 mBus.post(new SignupRequestEvent(new UserRequestParams(mName,mEmail,mPassword,mPasswordConfirmation )));

然后在同一个 Activity 中我有这个。

@Subscribe
public void onSignupCompleted(SignupCompletedEvent event) {
    System.out.println(String.format("in onSignupCompleted, got token = %s ", event.getParams().getToken()));

}

这里的问题是,就目前而言,每个 api 请求类型及其对应的响应类型都是唯一的事件类型,并且需要它自己的类,这看起来像是很多样板代码类型。

例如,要处理登录和退出,我需要这两个类:

public class SignupRequestEvent {
    protected UserRequestParams mSignupParams;

    public SignupRequestEvent(UserRequestParams signupParams) {
        mSignupParams = signupParams;
    }

    public UserRequestParams getParams() {
        return mSignupParams;
    }

}

public class SignupCompletedEvent {

    private SignupCompletedParams mSignupCompletedParams;
    public SignupCompletedParams getParams() {
        return mSignupCompletedParams;
    }
    public SignupCompletedEvent(SignupCompletedParams signupCompletedParams) {
        mSignupCompletedParams = signupCompletedParams;
    }

}

而且我认为大多数事件类几乎相同。

我想我应该只有 2 个事件用于 api 调用,一个用于请求,一个用于响应,但是每个接收 api 响应事件的方法都需要检查它是否是对所需请求的响应。

这个选项的意思是这样的:

ApiRequestEvent apiRequestEvent = new ApiRequestEvent();
apiRequestEvent.setAction("SIGNUP");
apiRequestEvent.setParameters(new UserRequestParams(mName,mEmail,mPassword,mPasswordConfirmation ));
mBus.post(apiRequestEvent);

然后像这样处理响应:

@Subscribe
public void onSignupCompleted(ApiResponseAvailable event) {
    if (event.getResponseTo != "SIGNUP") return;
    System.out.println(String.format("in onSignupCompleted, got token = %s ", event.getParams().getToken()));

也许有一种方法可以使用泛型?

当有一组事件可以像这样组合在一起时,有人可以解释如何有效地使用事件总线吗?

最佳答案

您想多了 - 继续为每个事件创建一个消息对象。

关于java - 如何有效地使用事件总线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23543951/

相关文章:

ios - 在我的 iOS 应用程序中创建模型类的正确要求是什么?

java - JSON/Java/安卓 : deserialisation from a String to a ArrayList<Strings>

android - 有没有办法检测 apk 是否存储在 SD 卡上?

java - 有这方面的模式吗?对某些子类具有特殊操作的通用基类

java - Android:我需要像图像一样做一个菜单

java - XML 在 Android 中不显示

c# - 如何更改此设计以避免沮丧?

java - 两个非常大的数相加

java - 将通用列表转换为数组。为什么我需要使用克隆?

java - 过期 session 出现 NullPointerException