【问题标题】:How do I effectively use an event bus?如何有效地使用事件总线?
【发布时间】:2014-05-08 13:59:08
【问题描述】:

现在我正在探索一些用于 android 学习项目的选项。 我正在尝试与我的 rails api(也是一个学习项目)进行交流。

在做了一些研究之后,我想我已经确定了一个使用改造和 otto 的方案。

我最终得到的是这个。 当我想调用我的 Rails 服务器时(在这种情况下进行注册),我会在活动中执行此操作。

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

然后在同一个活动中我有这个。

@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 android design-patterns otto


    【解决方案1】:

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

    【讨论】:

    • 感谢格雷的回复。那么你是说我应该使用上面描述的每个 api 调用的 2 个类,还是更简单的方法?顺便说一句,我觉得我在刮胡子之前更灰了 :)
    • 好吧,上次我这样做时,我没有使用消息总线来请求 api 调用 - 我为此调用了一个意图服务,但让服务在完成时发布消息 - 所以每个 api 调用只有一条消息。哦,我也没有胡子了:-o
    • 解决一些我没有标记为已回答的老问题。我知道这有点晚了,但我在我的问题中暗示的内容以及 Grey 确认的内容基本上是我最终所做的,而且它似乎工作得很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-16
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多