2015-05-19 61 views
12

我對使用MVP在Android上保存狀態存在一些疑問。我將我的片段/活動定義爲視圖,然後實施相應的演示者。MVP Android - 在哪裏保存視圖狀態?

我的例子很簡單:

我有一些複選框和紡紗一個活動。如果該活動被Android系統銷燬並重新創建,我應該在哪裏保存這些spinners和複選框狀態?在視圖上?在主持人?

如果在視圖上,我應該在視圖還是演示者上具有還原邏輯?

謝謝!

回答

2

在MVP的情況下,模型負責保持視圖的狀態。

例如,在你模型中,你有一個實體與數組類別。 在您的視圖中,每個類別都有一個複選框,並且在每個選中/未選中的操作中,您可以從帖子的類別數組中添加/刪除對象。

一旦恢復活動,在查看應以找出索要郵政類別陣列被選中的,哪些不是,所以它可以設置適當的選中/取消選中屬性。

這裏是一個非常好的職位看:http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/

+0

我明白,但我的例子是一種創造形式。所以我的模型可能是一個帶有類別的帖子。問題是我從不保存後期對象。目標是創建一個後期對象並使用它來發出Web請求。所以,我想我做這件事的唯一方法是存儲在視圖中,然後重新創建視圖的狀態。我錯了嗎? @mmark –

+1

@FábioCarballo如果我沒有誤解MVP的目標,你將不需要保存Post對象(通過「保存」我假設你的意思是像本地數據庫或SharedPreferences之類的東西)。主持人+模型是應該在視圖狀態變化中堅持(在內存中)的人 – mmark

0

演示者是模型和視圖之間的接口,不應該採取任何節能狀態的任何責任。讓Model或View處理狀態更有意義:

  1. Model。 Presenter負責在活動初始​​化期間填充View with Model數據並提交全部立即查看與模型的交互。模型始終保持最新,因此配置更改無關緊要。
  2. 查看。 Presenter負責在初始化期間填充View with Model數據,但View會保存並恢復配置更改時自己的狀態。這在創建/編輯情況下是有意義的,其中「保存」按鈕存在,並且您有一個瞬態模型(或工作模型)。

當'Save'按鈕存在時,後一種方法是有意義的。演示者不涉及任何方式。

0

1.保存&在視圖中恢復視圖狀態(活動/片段)。

我寧願節省&在視圖本身(活動/片段)恢復視圖的狀態

因此,它的觀點負責保存其狀態(因此堅持單一職責原則)。

/** 
* On Save Instance State. 
* 
* @param outState Out State. 
*/ 
@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString(STATE_KEY_USERNAME, getUserNameFieldValue()); 
    outState.putString(STATE_KEY_PASSWORD, getPasswordFieldValue()); 
    outState.putBoolean(STATE_KEY_REMEMBER_ME, getRememberMeFieldValue()); 
} 

/** 
* On Restore Instance State. 
* 
* @param savedInstanceState Saved Instance State. 
*/ 
@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    if (savedInstanceState != null) { 
     String userName = savedInstanceState.getString(STATE_KEY_USERNAME, ""); 
     String password = savedInstanceState.getString(STATE_KEY_PASSWORD, ""); 
     boolean rememberMe = savedInstanceState.getBoolean(STATE_KEY_REMEMBER_ME, false); 

     userNameEditText.setText(userName); 
     passwordEditText.setText(password); 
     rememberMeCheckBox.setChecked(rememberMe); 
    } 
} 

2.保存&恢復演示狀態演示

如果您需要保存演示中的任何狀態,那麼做演示者。

我的基地主持人看起來這

/** 
* On Create View. 
* <p> 
* 1. Gets called from view's onCreate method. 
* 
* @param view   View. 
* @param savedInstanceState Saved Instance State. 
*/ 
void onCreateView(final View view, final Bundle savedInstanceState); 

/** 
* On Attach View. 
* <p> 
* 1. Gets called from view's onStart method. 
*/ 
void onAttachView(); 

/** 
* On Detach View. 
* <p> 
* 1. Gets called from view's onStop method. 
*/ 
void onDetachView(); 

/** 
* On Save State. 
* <p> 
* 1. Gets called before view is destroyed to save the state of the presenter. 
* 
* @param outState Bundle in which to place your saved state. 
*/ 
void onSaveState(final Bundle outState); 

/** 
* On Destroy View. 
* <p> 
* 1. Gets called from view's onDestroy method. 
*/ 
void onDestroyView();