Подтвердить что ты не робот

MVP Android - Где сохранить состояние просмотра?

У меня есть некоторые сомнения относительно состояния сохранения с помощью MVP на Android. Я определил свои фрагменты/действия как представления, а затем представил соответствующих докладчиков.

Мой пример прост:

У меня есть активность с некоторыми флажками и прядильщиками. Если активность разрушена системой Android, а затем воссоздана, где я должен сохранять состояния этих счетчиков и флажков? На вид? На презентаторе?

Если на представлении должна быть логика восстановления на представлении или на презентаторе?

Спасибо!

4b9b3361

Ответ 1

В случае MVP используется модель, которая отвечает за сохранение состояния представления.

Например, в вашей модели у вас есть объект Post с массивом Категории. По вашему мнению, у вас есть флажок для каждой категории, и в каждом выбранном/непроверенном действии вы добавляете/удаляете объекты из массива Post Category.

После восстановления активности Вид должен запрашивать массив Post Категория, чтобы узнать, какие из них выбраны и какие aren 't, поэтому он может установить соответствующий проверенный/непроверенный атрибут.

Вот действительно хорошая статья об этом: http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/

Ответ 2

Ведущий - это интерфейс между Моделью и Представлением и не должен нести никакой ответственности за сохранение любого состояния. Имеет смысл указывать состояние модели или представления:

  • Модель. Ведущий несет ответственность за заполнение данных View with Model во время инициализации активности и мгновенное завершение всех взаимодействий View с моделью. Модель всегда обновляется, поэтому изменения конфигурации неактуальны.
  • Просмотр. Presenter отвечает за заполнение данных View with Model во время инициализации, однако View сохраняет и восстанавливает собственное состояние при изменении конфигурации. Это имеет смысл в ситуации создания/редактирования, когда существует кнопка "Сохранить", и у вас есть временная модель (или рабочая модель).

Последний подход имеет смысл, когда существует кнопка "Сохранить". Ведущий не участвует в любом случае.

Ответ 3

1. Сохранить и восстановить состояние просмотра в представлении (Activity/Fragment).

Я предпочитаю сохранять и восстанавливать состояние представления в самом представлении (Activity/Fragment)

Следовательно, это ответственность за сохранение своего состояния (следовательно, придерживаются принципа единой ответственности).

Пример

/**
 * 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 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 onStart method.
 */
void onAttachView();

/**
 * On Detach View.
 * <p>
 * 1. Gets called from view 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 onDestroy method.
 */
void onDestroyView();

Ответ 4

Возможно, это помогает: https://github.com/Yarikx/reductor. Это предсказуемый контейнер состояния, вдохновленный JavaScript Redux.