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

现在我正在探索一个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; } } 

我认为大多数事件类都非常相同。

我想我应该为api调用只有2个事件,一个用于请求,一个用于响应,但是接收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())); 

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

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

你是在思考它 – 只需继续为每个事件创建一个消息对象。