MVP Android - 在哪里保存视图状态?

时间:2015-05-19 17:13:56

标签: android mvp

我对在Android上使用MVP的状态保存有些怀疑。我将我的片段/活动定义为视图,然后实现了相应的演示者。

我的例子很简单:

我有一些带有复选框和微调器的活动。如果活动被Android系统销毁然后重新创建,我应该在哪里保存这些微调器和复选框状态?在视图?在演示者?

如果在视图中,我应该在视图上还是在演示者上有恢复逻辑?

谢谢!

5 个答案:

答案 0 :(得分:2)

在MVP的情况下,模型负责保持视图的状态。

例如,在您的模型中,您有一个发布实体,其数组为类别。 在您的视图中,每个类别都有一个复选框,在每个选中/取消选中的操作中,您都可以在帖子的类别数组中添加/删除对象。

恢复活动后,查看应该要求发布 类别数组,以便找出哪些是已选中且不是,因此可以设置正确的选中/未选中属性。

这是关于它的非常好的帖子:http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/

答案 1 :(得分:2)

Presenter是Model和View之间的接口,不应该对保存任何状态负责。让Model或View处理状态更有意义:

  1. 模型。 Presenter负责在活动初始​​化期间使用模型数据填充视图,并立即提交所有查看与模型的交互。模型始终保持最新,因此配置更改无关紧要。
  2. 查看。 Presenter负责在初始化期间使用模型数据填充视图,但View会在配置更改中保存并恢复其自身状态。这在创建/编辑情况下是有意义的,其中存在“保存”按钮并且您具有瞬态模型(或工作模型)。
  3. 当存在“保存”按钮时,后一种方法有意义。演示者不参与任何一种方式。

答案 2 :(得分:1)

<强> 1。保存&amp;恢复视图中的视图状态(活动/片段)。

我更喜欢保存&amp;在视图中恢复视图的状态(活动/片段)

因此,拯救其国家的责任是有责任的(因此坚持单一责任原则)。

示例

/**
 * 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。保存&amp;在Presenter中恢复演示者状态

如果您需要保存演示者的任何状态,请在演示者中进行。

My Base主讲人会看这个

 /**
 * 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();

答案 3 :(得分:0)

也许这会有所帮助:https://github.com/Yarikx/reductor。它是一个可预测的状态容器,受JavaScript的Redux启发。

答案 4 :(得分:0)

这可以通过使用有状态演示者的概念来实现,在该状态中,演示者可以知道状态。 这是我在网上找到的一个很好的示范:https://pspdfkit.com/blog/2016/restoring-state-in-android-mvp-architecture

这有助于我保持干净的MVP架构,同时能够还原和保存视图(活动/片段)状态