【发布时间】:2015-08-22 05:56:36
【问题描述】:
我正在使用与 EventBus (Otto) 结合的模型-视图-演示者设计模式。我实现此模式的全部原因是仅将事件与演示者分离,并让演示者更新视图。
这是我的一些代码示例,我将以获取Events 为例。 (请注意Events 与EventBus Event 不同,这意味着Events 中的Event 是“爸爸的生日”之类的事件,但EventBus 中的Event 是公共汽车-事件)。
片段
public class EventFragment extends Fragment {
private EventPresenter mEventPresenter;
// Initialize boilerplate code...
private void init() {
mEventPresenter = new EventPresenter();
mEventPresenter.loadEvents();
}
// I WANT TO MOVE THESE SUBSCRIPTION METHODS TO
// MY PRESENTER OR SUBSCRIBER, BUT THEY ARE
// COUPLED TO THE ADAPTER OR A VIEW
@Subscribe
public void onEventsLoaded(EventsLoaded eventsLoaded) {
List<Event> events = eventsLoaded.getEvents();
mAdapter.setEvents(events);
}
@Subscribe
public void onEventJoined(EventJoined eventJoined) {
mItemView.doAnimation();
mTextView.setText("Leave");
mAdapter.joinEvent(eventJoined.getEvent());
}
@Subscribe
public void onLeaveEvent(LeftEvent leftEvent) {
mItemView.doAnimation();
mTextView.setText("Join");
mAdapter.leftEvent(leftEvent.getEvent());
}
}
演示者
public class EventPresenter {
// This is the only method I have right now kind of defeats the purpose of
// having a presenter
public void loadEvents() {
EventBus.getInstance().post(new LoadEvents());
}
}
订阅者
public class EventSubscriber extends Subscriber {
// This class is registered on the event bus
@Subscribe
public void onLoadEvents(LoadEvents loadEvents) {
sClient.getEvents(new Callback<List<Event>>() {
@Override
public void onSuccess(List<Event> events, Response response) {
EventBus.post(new EventsLoaded(events));
}
@Override
public void onFailure(.....) {
// Handle failure
}
};
}
}
如何让 Presenters 和 Subscribers 处理所有业务逻辑,而让 Fragment 只处理视图?
【问题讨论】:
-
可能正在订阅 Presenter 中的事件,其中包含视图实例可以提供帮助。就像演示者从事件总线获取事件并调用适当的视图方法来更新 UI。
-
你能发布一个示例答案吗?
标签: android mvp event-bus otto