2016-11-09 70 views
0

我有一個使用MVP模式設計的應用程序。但有時我不確定我們所有的實現都堅持MVP最佳實踐。儘管按照本書開展工作並不總是可行的,但我試圖弄清楚哪些應該成爲處理非用戶交互的邏輯。MVP和非用戶交互

例如:

我具有檢測的垂直滾動RecyclerView的偏移。當滾動達到內容高度的20%(粗略)時,我應該彈出一個對話框。現在,我的邏輯將是(僞代碼)

1. Presenter sets View.setVerticalOffsetTriggeringLimit(1000 pixels) 
2. View triggers view event and call Presenter.offsetForPopUpReached() 
3. Presenter triggers View.showPopUp() 
4. pop up is shown 

優點和缺點?有沒有更好的方法,同時還有可測試的代碼?系統本身是一個「用戶」,應該使用演示者作爲中間層?

回答

0

所有UI邏輯都屬於View。演示者必須只有模型和視圖之間的交互邏輯。重點是,該視圖可能會有所不同 - 它可以是UI,也可以是某些模塊,通過套接字發送命令。問題的關鍵在於,在兩種情況下,「呈現邏輯」 - 視圖與數據交互保持不變,因此必須移入Presenter。彈出窗口,邊距等是View實現細節。 方便的練習 - 將Presenter創建爲單例,並將其注入到Activity中,然後實現View並將其連接到該View。 您可以通過EventBus發送來自演示者的事件(粘性事件)來消除模型。如果你這樣做,事件將等待,直到活動收到它(metigate活動生命週期)。前一段時間我遇到過這種方法。

+0

嗯,我可以爭辯。在按下按鈕之後讓演示者更新視圖與滾動1000個像素並觸發事件沒有區別。無論如何,模型始終與視圖分離。這完全是關於測試用例,並讓Actor不一定是人,但應該平等對待UI的一部分。這種事件不僅僅是UI的東西,而是可能(或可能不)與模型相互作用的整個事件鏈。 – shadox

+1

是的,我想,你就在這裏。嘗試在這裏使用'mediator' - 界面,用傳遞給View的RecyclerView抽象滾動事件及其實現。它可以替換爲模擬測試。 –