MVP Android - Где сохранить состояние просмотра?
У меня есть некоторые сомнения относительно состояния сохранения с помощью MVP на Android. Я определил свои фрагменты/действия как представления, а затем представил соответствующих докладчиков.
Мой пример прост:
У меня есть активность с некоторыми флажками и прядильщиками. Если активность разрушена системой Android, а затем воссоздана, где я должен сохранять состояния этих счетчиков и флажков? На вид? На презентаторе?
Если на представлении должна быть логика восстановления на представлении или на презентаторе?
Спасибо!
Ответы
Ответ 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.