Описание приложения
Я впервые пытаюсь реализовать приложение для Android с MVP, в котором отображается сообщение (взятое из пула сообщений), и оно изменяется, когда пользователь нажимает на экран.,Как только все сообщения будут отображены, процесс начнется заново (в том же порядке сообщений).Требуется отобразить то же сообщение, если приложение закрыто / повторно открыто.Таким образом, мы должны реализовать некоторые механизмы хранения / восстановления состояния в модели MVP.
Вот базовая демонстрация приложения:
MVP Design
Я реализовал этот MVP дляэто приложение выглядит следующим образом:
- Модель позаботится о что будет следующим сообщением (оно реализует состояние приложения).
- Presenter решает , когда запрашивать следующее сообщение (для обновления состояния), в зависимости от полученных событий от пользователя (через представление).
- Просмотр решает как показывать фактическое сообщение и передает события от пользователя (щелчки на экране) докладчику.Кроме того, поскольку View также является
MainActivity
, он заботится о создании реализаций Presenter и Model.Наконец, сохраняет состояние модели (как Parcelable
) с onSaveInstanceState
(а также восстанавливает его).
Некоторый код
(Частичное) Просмотр реализации:
class MainActivity : AppCompatActivity(), ViewMVC {
private lateinit var presenter: Presenter
private var model: Model? = CircularModel(LinkedList<State>(Arrays.asList(
State("First"),
State("Second"),
State("Third")
)))
override fun onCreate(savedInstanceState: Bundle?) {
if (savedInstanceState != null) {
model = savedInstanceState.getParcelable("model")
}
presenter = PresenterImpl(this, model!!)
}
override fun onSaveInstanceState(outState: Bundle?) {
outState?.putParcelable("model", model!!)
super.onSaveInstanceState(outState)
}
(Частичное) Реализация модели:
@Parcelize
class CircularModel constructor(var states: @RawValue Deque<State>?) : Model, Parcelable {
override fun getModelState(): State {
return states!!.peekFirst()
}
override fun getModelNextState(): State {
// Black magic happening here!
return getModelState()
}
}
Проблема / Мой вопрос
Поскольку Presenter и Model должны быть «независимыми от Android», сохранение состояния приложения (т. Е. Объекта Model) обеспечивается представлением.Однако это нарушает принцип, когда представление не знает модель. У меня вопрос: как сохранить объект Model, если View не знает о его реальной реализации?Каков наилучший способ обработки состояния модели в этом сценарии?
Фактическим решением может быть написание кода для сериализации модели в самой модели и сохранение его для каждого getNextState()
,но это будет означать использование вызовов Android в модели (и снижение ее тестируемости).