簡體   English   中英

Android MVP - 屏幕方向 - 保留演示者狀態

[英]Android MVP - screen orientation - retain presenters state

我對Android中的MVP模式有疑問。 我想編寫自己的“應用程序核心”,它將為演示者,視圖等提供基類。它必須簡單,干凈且“穩定”。 我的想法與莫斯比提供的內容非常類似,我正在努力實現這樣的目標:

  1. 每個Activity都有自己的PresenterView (與Activity通信的接口), ViewState (保存持久數據的parcelable對象)。
  2. Activity銷毀時

    • 分離視圖
    • 將ViewState保存在bundle中
    • 取消Presenter中的所有后台任務(完成后更新View的任務)
    • 摧毀主持人
  3. 重新創建 活動時

    • 附上視圖
    • 恢復ViewState
    • 創建Presenter的新實例
    • 重新啟動已取消的后台任務

除了最后一期 - “重啟已取消的后台任務”之外,我幾乎完成了任務 用一個例子來討論它會更容易。 所以,假設我在演示者中有兩種方法(Retrofit 2調用):

  • downloadUsers() - 從Web服務器和onSuccess更新視圖中獲取用戶數據
  • downloadProject() - 從Web服務器和onSuccess更新視圖中獲取項目信息

現在,當其中一個調用已啟動但尚未完成時,用戶正在更改配置。 當重新創建Presenter時,我怎么知道應該重新啟動哪一個?

我想到的唯一想法是為每個任務創建一個持久的布爾標志,在任務啟動時將其設置為true,在完成任務時將其設置為false 當創建Presenter時,我將檢查每個標志並重新啟動相應的呼叫。

你怎么看待這件事? 如何改進? 還有其他想法嗎?

我不知道您的用戶界面是怎樣的,但對我而言,您應該將您的一個大視圖拆分為兩個子視圖:

  • DownloadUsersPresenter管理的DownloadUsersView + ViewState
  • DownloadProjectsPresenter管理的DownloadProjectsView + ViewState

從我的觀點來看,MVP只有一個單獨的模型可以在View中顯示(而不是像你的場景中那樣)。 通常,如果您必須在同一視圖中處理兩個模型,則表明您可以將此視圖和演示者拆分為兩個不同的模型。

或者,您可以將兩個模型合並為一個模型

class DownloadModel {
  List<User> users;
  List<Project> projects;
}

然后組合兩個Retrofit調用來創建一個DownloadModel ,當兩個調用完成后,您可以在視圖中顯示DownloadModel 使用retrofit和rxjava,這非常簡單(請參閱combineLatest()運算符)。 在這種情況下,您沒有遇到此問題,因為您的Presenter只有一個download()方法可以並行下載。 如果一個比另一個快得多,那么很可能在方向改變和演示者的重新創建后,更快的一個來自改造緩存,所以這不應該打擾你。

正如您已經說過的那樣,您也可以開始跟蹤之前正在執行http調用的演示者,並在演示者重新實例化后重新調用它們,但這意味着演示者必須將其內部狀態保存到捆綁中。 莫斯比沒有對此做出任何說明,並假設一般沒有這種需要。 因此,Mosby的默認Presenter實現不提供presenter.saveInstanceState(Bundle)presenter.restoreInstanceState(Bundle) 但這並不意味着你不能/不應該這樣做。 你可以在Mosby和你的實現中做到這一點。 但是,如果您開始這樣做,那么您只需將之前(不帶mvp)的意大利面條代碼放在Activity類中進入演示者。

因此,我強烈建議在MVP中為每個視圖設置一個模型。

順便說一句。 為什么重新發明輪子? 聽起來像莫斯比已經提供了你正在尋找的東西。 Mosby還支持保留演示者,這些演示者可以保持屏幕方向的變化。

有許多方法和解決方案。 我喜歡的是使用Loaders api。 這是一個簡單的庫,您可以使用它來保持演示者實例的方向更改https://github.com/samiuelson/Preservely

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM