【发布时间】:2019-03-07 01:00:03
【问题描述】:
应用说明
我第一次尝试使用 MVP 实现 Android 应用程序,其中显示一条消息(取自消息池),并在用户单击屏幕时更改。显示所有消息后,该过程将重新开始(遵循相同的消息顺序)。如果应用程序关闭/重新打开,要求是显示相同的消息。所以,我们必须在 MVP 模型中实现一些存储/恢复状态机制。
这是应用程序的基本演示:
MVP 设计
我已经为这个应用实现了这个 MVP,如下所示:
- 模型负责什么下一条消息(它实现应用程序状态)。
- Presenter 决定何时 请求下一条消息(更新状态),这取决于从用户(通过视图)接收到的事件。李>
-
视图决定如何显示实际消息并将用户的事件(点击屏幕)传达给演示者。此外,由于 View 也是
MainActivity,因此需要实例化 Presenter 和 Model 实现。最后,它使用onSaveInstanceState保存模型状态(作为Parcelable)(并恢复它)。
一些代码
(部分)查看实施:
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 对象)由 View 负责。但是,这打破了 View 不知道 Model 的原则。 我的问题是:如何保存模型对象,而视图不知道它的实际实现?在这种情况下处理模型状态的最佳方法是什么?
实际的解决方案可能是编写代码来序列化模型本身中的模型并为每个getNextState() 保存它,但这意味着在模型中使用 Android 调用(并降低其可测试性)。
【问题讨论】:
标签: android design-patterns model mvp model-view