我在我的项目中使用Otto库。我需要这个库中的任何功能,其中没有。我想这样做:
Bus.post(MessageType.USER_SIGN_UP_SUCCESS, user);
并且在我的方法中意识到这样做:
@Subscribe({MessageType.USER_LOGGED_IN_SUCCESS, MessageType.USER_SIGN_UP_SUCCESS})
public void getUserFromServer(User user) {
,,,,,,,,,,,,,,
}
为此我必须从githab复制所有Otto类,并更改它们。我无法从Otto实现,因为一些变量是私有的。
并更改了Bus类中的访问修饰符并从中扩展。
public class SkipBus extends Bus {
public void post(MessageType messageType, Object event) {
if (event == null) {
throw new NullPointerException("Event to post must not be null.");
}
enforcer.enforce(this);
Set<Class<?>> dispatchTypes = flattenHierarchy(event.getClass());
boolean dispatched = false;
for (Class<?> eventType : dispatchTypes) {
Set<EventHandler> wrappers = getHandlersForEventType(eventType);
if (null == wrappers || wrappers.isEmpty()) {
continue;
}
dispatched = true;
for (EventHandler wrapper : wrappers) {
Subscribe annotation = wrapper.method.getAnnotation(Subscribe.class);
boolean isFounded = false;
MessageType messageTypes[] = annotation.value();
for (MessageType type : messageTypes) {
if (type == messageType) {
isFounded = true;
break;
}
}
if (isFounded) {
enqueueEvent(event, wrapper);
}
}
}
if (!dispatched && !(event instanceof DeadEvent)) {
post(new DeadEvent(this, event));
}
dispatchQueuedEvents();
}
}
但为此我必须复制项目中的所有类。 告诉我怎样才能让它变得更容易?或告诉我另一个可以做我想做的图书馆
答案 0 :(得分:1)
实际上,Otto旨在使用Object的类型来分隔消息类型。
@Subscribe
public void eventReceived(UserSignUpEvent user) {
}
@Subscribe
public void eventReceived(UserLoginEvent user) {
}
或
<强> MainActivity.java 强>
@Subscribe
public void eventReceived(User user) {
if (user.getMessageType() == MessageType.USER_SIGN_UP_SUCCESS) {
}
}
<强> SecondActivity.java 强>
@Subscribe
public void eventReceived(User user) {
if (user.getMessageType() == MessageType.USER_LOGIN_SUCCESS) {
}
}
您无需像这样分离MessageType(您不应该)。我建议你将代码设计模式改为Otto的设计模式。否则,您必须复制整个Otto源代码并进行编辑,就像您当前所做的那样。
答案 1 :(得分:0)
Otto本身很简单,所以不需要扩展它。您只需为它创建事件和事件处理程序。事件可以是任何对象,因此您可以执行以下操作:
public enum LoginType {
SUCCESS,
FAILED
}
在您的登录处理器中:
private void login(...) {
// process login
// if everything is ok
if(...) {
bus.post(LoginType.SUCCESS);
} else {
bus.post(LoginType.FAILED);
}
}
在任何需要的地方处理此事件:
@Subscribe
public void onLogin(LoginType loginType) {
switch(loginType) {
case SUCCESS:
// do what you need
break;
case FAILED:
// show an error or something
break;
}
}
因此无需扩展库,您只需以适当的方式设计事件。