2017-01-26 48 views
6

我正在開發一個可執行人類活動識別的Android應用程序。Android服務應該在MVP模式中扮演什麼角色?

它基本上是這樣工作的 - 服務不斷讀取加速器數據並將已識別的活動(即散步,正在運行)存儲在數據庫中。用戶可以在活動中看到ListView中所有已識別的活動(訪問數據庫)。數據庫中的每個用戶表都有一個pa_goal(物理活動目標)字段,服務從數據庫中讀取並執行一些檢查。

用戶當然可以從活動中更改此目標。因爲我將實施MVP架構模式。

我不確定把服務放在哪裏?它肯定不是查看。有什麼建議?

+0

它的數據模型的一部分,不是嗎? – pskink

+0

@pskink該服務僅將數據存儲到數據庫。這是做什麼。劑量這意味着我應該把它看作模型?我很困惑,因爲MVP的目的是將android代碼與java代碼分開,所以如果我將我的服務作爲模型進行威脅,我是不是做錯了? –

+1

,你正在使用一個自定義的'ContentProvider'?如果是這樣,請看https://github.com/googlesamples/android-architecture/tree/todo-mvp-contentproviders/(和https://github.com/googlesamples/android-architecture一般) – pskink

回答

8

在一個乾淨的架構中,這是我假設你正在使用MVP的,有一個想法從業務邏輯分離框架。這實際上是一個正常的演示者允許你做的事情。

在這種情況下,它不是你正在處理的視圖,但原理是相似的。您不希望所有業務或應用程序邏輯混合在Android代碼中,因爲您可以將它們分離出更好,更單一的責任類。所以我會說,雖然它不是一個視圖,你仍然應該有一個主持人類型類(可能更好被稱爲控制器或經理也許)。

這個類將是一個POJO,它控制着你的服務如何運行,這很容易通過標準的junit測試和服務模擬來測試。然後可以將此類和服務放入其自己的功能包中,並以與演示者相同的方式與後端模型進行交互。

總而言之,角色是應用程序的另一個功能,即站點與其他功能(通常只是我的體驗中的視圖)一起使用。

希望有幫助

+0

非常感謝你,亞歷克斯!這真的有幫助! :) –

+0

我只有一個問題。我是否認爲這個類 - 控制器應該傳遞一個上下文(例如啓動服務),因此它將包含android特定的代碼? –

+1

理想情況下,您不應該將它傳遞給上下文。由於上下文是android代碼,您希望將其保留在服務中以使控制器更易於測試。不要讓上下文變成上帝對象;) – MungoRae

1

我處於同樣的情況。最後,我決定做這樣的事情:

活動或片段超出範圍,他們不知道MVP什麼,但我想使用事件總線像奧托發送信號/事件,所以:

我的擴展某種Presenter的類對Android Context一無所知,但它們只有onAttachPresenter和onDetachPresenter,它們只有一個MvpView接口。

擴展Service的類將有一個Presenter屬性,並實現一些帶有onSucess,onError,onStart,onComplete或類似Otto的事件(onSucessEvent,onErrorEvent,onStartEvent,onCompleteEvent)的MvpView接口。

因此,當我需要做某件事時,活動或片段將啓動服務,服務將「開始」或與演示者交談,當演示者成功完成時,將調用mvpView.onSuccess()並存儲信息在本地數據庫中使用SQLite(可能是storeIO),最後服務會調用Otto並傳遞信號(沒有任何數據),可能是onComplete。 最後,信號將被我的用戶界面捕獲(可能是碎片),並在SQLite中檢索數據庫中的所有信息。

因此,當onSucess發生時,用戶界面將顯示最新的和最好的數據,但是當發生onError時(至少)會顯示一些信息(或者不是如果你想要)向用戶說「有問題,但至少你可以看到一些東西「,bot onSuccess和onError畢竟會調用onComplete。

不知道這是否是最好的解決方案,但在這種情況下,我認爲我不打算處理Activities或Fragments生命週期,並且不關心onSaveInstance並在用戶旋轉設備時恢復數據。它會一直提取數據庫中的最新數據,如果發生什麼事情(無法連接互聯網),您至少可以在收到onComplete信號時顯示一些信息。

一些事實,我還在想:

  • 演示者將不會是一個單獨的類
  • 演示一無所知上下文,但肯定與所有MyApplication類
  • 如果一個屏幕,會發生什麼(片段)你有不同的服務與不同的onSuccessEvents?只需使用某種行爲作爲ID,即可識別它們。
  • 永遠不要讓Activity Fragment實現MvpView,你將不得不處理生命週期。
+0

注入演示者。這是他解決問題的好辦法。我決定創建另一個名爲Controller的類,它需要一個Context作爲參數(我將不得不使用roboelectric來測試這個類),並且我的Presenter有一個這個類的實例,因此它不知道任何android特定的代碼,並且它能夠啓動一個服務,並停止它:)。至於Presenter的現場循環,對我而言並不算太壞。 –

+1

我不知道,但如果片段或活動啓動服務,我不會看到一件壞事。 Android知道Android的東西,但MVP不知道。 –

3

這篇文章幫助我在一個類似的情況,雖然可能不完全你的,這個想法是一樣的:

https://android.jlelse.eu/android-bound-services-and-mvp-12ca9f70c7c7

基本上,筆者的作品迴避的事實,綁定服務與活動緊密結合,併爲其增加額外的生命週期調用。

+0

謝謝你的建議,何塞。肯定會看看文章! :) –

相關問題