我对使用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