我對使用MVP在Android上保存狀態存在一些疑問。我將我的片段/活動定義爲視圖,然後實施相應的演示者。MVP Android - 在哪裏保存視圖狀態?
我的例子很簡單:
我有一些複選框和紡紗一個活動。如果該活動被Android系統銷燬並重新創建,我應該在哪裏保存這些spinners和複選框狀態?在視圖上?在主持人?
如果在視圖上,我應該在視圖還是演示者上具有還原邏輯?
謝謝!
我對使用MVP在Android上保存狀態存在一些疑問。我將我的片段/活動定義爲視圖,然後實施相應的演示者。MVP Android - 在哪裏保存視圖狀態?
我的例子很簡單:
我有一些複選框和紡紗一個活動。如果該活動被Android系統銷燬並重新創建,我應該在哪裏保存這些spinners和複選框狀態?在視圖上?在主持人?
如果在視圖上,我應該在視圖還是演示者上具有還原邏輯?
謝謝!
在MVP的情況下,模型負責保持視圖的狀態。
例如,在你模型中,你有一個後實體與數組類別。 在您的視圖中,每個類別都有一個複選框,並且在每個選中/未選中的操作中,您可以從帖子的類別數組中添加/刪除對象。
一旦恢復活動,在查看應以找出索要郵政類別陣列被選中的,哪些不是,所以它可以設置適當的選中/取消選中屬性。
這裏是一個非常好的職位看:http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/
演示者是模型和視圖之間的接口,不應該採取任何節能狀態的任何責任。讓Model或View處理狀態更有意義:
當'Save'按鈕存在時,後一種方法是有意義的。演示者不涉及任何方式。
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();
也許這會有所幫助:https://github.com/Yarikx/reductor。這是一個可預測的狀態容器,受JavaScript的Redux啓發。
我明白,但我的例子是一種創造形式。所以我的模型可能是一個帶有類別的帖子。問題是我從不保存後期對象。目標是創建一個後期對象並使用它來發出Web請求。所以,我想我做這件事的唯一方法是存儲在視圖中,然後重新創建視圖的狀態。我錯了嗎? @mmark –
@FábioCarballo如果我沒有誤解MVP的目標,你將不需要保存Post對象(通過「保存」我假設你的意思是像本地數據庫或SharedPreferences之類的東西)。主持人+模型是應該在視圖狀態變化中堅持(在內存中)的人 – mmark