Презентер Model View с EventBus, как вернуть события в Presenter?

Я использую шаблон проектирования Model-View-Presenter в сочетании с EventBus (Otto). Единственная причина, по которой я реализовал этот шаблон, заключается в том, чтобы отделить события только от ведущего и заставить ведущего обновлять представления.

Это пример кода, который у меня есть, я буду использовать получение Events в качестве примера. (Обратите внимание, что Events отличается от EventBus Event, что означает, что Event в Events — это событие, подобное «Дню рождения папы», а Event в EventBus — это автобусное событие).

Фрагмент

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

Как я могу заставить докладчиков и подписчиков обрабатывать всю бизнес-логику, а фрагмент обрабатывать только представления?


person AndyRoid    schedule 22.08.2015    source источник
comment
может быть подписка на события в Presenter , может помочь экземпляр представления внутри него. Как ведущий получает события от шины событий и вызывает соответствующий метод представления для обновления пользовательского интерфейса.   -  person MohK    schedule 22.08.2015
comment
Можете ли вы опубликовать пример ответа?   -  person AndyRoid    schedule 22.08.2015


Ответы (2)


Это не лучшая возможность, но May Be поможет вам.

может помочь подписка на события в Presenter с экземпляром представления внутри него. Как ведущий получает события от шины событий и вызывает соответствующий метод представления для обновления пользовательского интерфейса.

Имейте в виду, что я не изменил имена методов вашего фрагмента, который обновляет пользовательский интерфейс, и передал объект события непосредственно от ведущего, который действительно теперь является подписчиком событий шины событий. Вы можете изменить его соответствующим образом.

Фрагмент---

public class EventFragment extends Fragment {

    private EventPresenter mEventPresenter;

    // Initialize boilerplate code...

    @Override
    public void onResume()
    {
         mEventPresenter.onResume();
    } 

    @Override
    public void onPause()
    {
         mEventPresenter.onPause();
    }  

    private void init() {
        mEventPresenter = new EventPresenter(this);
        mEventPresenter.loadEvents();
    }

    // I WANT TO MOVE THESE SUBSCRIPTION METHODS TO
    // MY PRESENTER OR SUBSCRIBER, BUT THEY ARE 
    // COUPLED TO THE ADAPTER OR A VIEW

    public void onEventsLoaded(EventsLoaded eventsLoaded) {
        List<Event> events = eventsLoaded.getEvents();
        mAdapter.setEvents(events);
    }

    public void onEventJoined(EventJoined eventJoined) {
        mItemView.doAnimation();
        mTextView.setText("Leave");
        mAdapter.joinEvent(eventJoined.getEvent());
    }

    public void onLeaveEvent(LeftEvent leftEvent) {
        mItemView.doAnimation();
        mTextView.setText("Join");
        mAdapter.leftEvent(leftEvent.getEvent());
    }

}

Ведущий----

    public class EventPresenter {
        private EventFragment targetView; 
        public EventPresenter(EventFragment myView)
        {
             targetView = myView;

        }
        // 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());
        }

    @Subscribe
    public void onEventsLoaded(EventsLoaded eventsLoaded) {
        targetView.onEventsLoaded(eventsLoaded);
    }

    @Subscribe
    public void onEventJoined(EventJoined eventJoined) {
        targetView.onEventJoined(eventJoined);
    }

    @Subscribe
    public void onLeaveEvent(LeftEvent leftEvent) {
        targetView.onLeaveEvent(leftEvent);
    }


    public void onResume()
    {
         //subscride event bus
    } 


    public void onPause()
    {
         //unsubscride event bus
    }  
    }
person MohK    schedule 22.08.2015
comment
Спасибо за публикацию этого ответа, как бы вы справились с чем-то вроде методов жизненного цикла фрагмента? Или предотвратить утечку Activity при передаче в Presenter? - person AndyRoid; 22.08.2015
comment
Кроме того, как бы вы отказались от подписки на шину событий в ведущем? - person AndyRoid; 22.08.2015
comment
Я предполагаю, что в методе жизненного цикла, где фрагмент или действие попадает в onPause или onDestroy, вызовите аналогичный метод в презентаторе и отмените регистрацию шины или установите цель на ноль! Обновите свой ответ, чтобы включить это, и я приму ваш ответ. - person AndyRoid; 22.08.2015

Это обязанность докладчиков отправлять или получать события, а затем уведомлять о фрагментах или действиях.

person fab    schedule 22.08.2015
comment
вы экономите мое время, спасибо - person tux-world; 05.06.2017