2015-08-22 35 views
3

我正在使用與EventBus(Otto)相結合的Model-View-Presenter設計模式。我實現此模式的全部原因是僅將事件與演示者分開,並讓演示者更新視圖。模型查看使用EventBus的演示者,如何將事件返回給演示者?

這是一些我有的代碼的例子,我將以Events爲例。 (請注意,EventsEventBusEvent不同,這意味着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()); 
    } 

} 

用戶

​​

我怎樣才能得到預Senters和訂閱者來處理所有的業務邏輯,並讓Fragment只處理視圖?

+0

可能訂閱事件演講,與視圖中,它可以幫助一個實例。如主持人從事件總線獲取事件並調用適當的視圖方法來更新UI。 –

+0

你能發表一個示例答案嗎? – AndyRoid

+0

檢查我的答案。 –

回答

5

這是不是最好的可能性,但也可以幫助你。

在演示者中訂閱事件,在裏面有一個視圖實例可以提供幫助。如主持人從事件總線獲取事件並調用適當的視圖方法來更新UI。

記住,我沒有改變你的片段更新UI的方法名,並已通過直接從發言的事件對象,它是現在確實eventbus的事件的訂戶。你可以相應地改變它。

片段---

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 
    } 
    } 
+0

感謝張貼這個答案,你會如何處理類似片段生命週期的方法?或者在傳遞給Presenter時防止活動泄漏? – AndyRoid

+0

另外,如何取消訂閱演示者中的事件總線? – AndyRoid

+1

我的猜測是,在該片段或活動打的onPause或的onDestroy生命週期方法,調用類似的方法在主持人和註銷總線或目標設置爲空!更新你的答案,包括這一點,我會接受你的答案。 – AndyRoid

5

這是責任到主持人發送或接收事件後通知片段或活動

+0

您節省我的時間,謝謝 –

相關問題