Como uso efetivamente um barramento de events?

Agora estou explorando algumas opções para um projeto de aprendizado do Android. Eu estou tentando se comunicar com meus rails api (também um projeto de aprendizado).

Depois de fazer algumas pesquisas, acho que me adaptei a um esquema que usa retrofit e otto.

O que eu acabo é isso. Quando eu quero fazer uma chamada para o meu servidor rails (neste caso para fazer uma inscrição) eu faço isso na atividade.

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

e então na mesma atividade eu tenho isso.

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

O problema aqui é que, do jeito que está, cada tipo de requisição api e seu tipo de resposta correspondente seria um tipo de evento único e exigiria sua própria class, o que parece ser um monte de código de tipo boiler plate.

Por exemplo, para gerenciar entrar e sair, eu precisaria dessas duas classs:

 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; } } 

E eu acho que a maioria das classs de events seria praticamente idêntica.

Eu estou pensando que eu deveria ter apenas 2 events para chamadas de API, um para solicitações e um para respostas, mas cada método que recebe um evento de resposta da API precisaria verificar se é uma resposta à solicitação desejada.

Esta opção significaria algo como isto:

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

e, em seguida, para lidar com a resposta algo como isto:

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

Talvez haja uma maneira de usar genéricos?

Alguém pode explicar como usar efetivamente um barramento de events quando há um conjunto de events que podem ser agrupados assim?