Android 服务在 MVP 模式中应该扮演什么角色?
What role an Android Service should play in the MVP pattern?
我正在开发一个 Android 应用程序来进行人类 Activity 识别。
它基本上是这样工作的-服务不断读取加速器数据并将识别的activity(即步行,运行)存储在数据库中。用户可以在 activity 中的 ListView
中看到所有已识别的活动(访问数据库)。数据库中的每个用户 table 都有一个 pa_goal(物理 activity 目标)字段,服务从数据库中读取该字段并进行一些检查。
用户当然可以从 activity 更改此目标。因为我将实施 MVP 架构模式。
我不确定将服务放在哪里?它肯定不是视图。有什么建议吗?
在一个干净的架构中,这就是我假设您使用 MVP 的目的,存在将框架与业务逻辑分离的想法。这基本上是普通演示者允许您执行的操作。
在这种情况下,它不是您正在处理的视图,但原理是相似的。当您可以将它们分开以获得更好、更单一的责任 class 时,您不希望所有业务或应用程序逻辑都混合在 Android 代码中。所以我想说,虽然它不是一个视图,但您仍然应该有一个演示者类型 class(也许最好称为控制器或经理)。
这 class 将是一个 POJO,它控制您的服务的行为方式,可以使用标准的 junit 测试和服务模拟轻松测试。然后可以将此 class 和服务放入其自己的功能包中,并以与演示者相同的方式与后端模型交互。
因此,总而言之,该角色是您应用的另一个功能,它与其他功能(根据我的经验通常只是视图)并排放置。
希望对您有所帮助
我也是这种情况。最后我决定做这样的事情:
活动或片段超出范围,他们对 MVP 一无所知,但我将使用像 Otto 这样的事件总线来发送 signals/events,所以:
我的 classes 扩展了某种 Presenter 对 Android Context 一无所知,但它们将有一个 MvpView 接口,只有 onAttachPresenter 和 onDetachPresenter。
扩展 Service 的 class 将具有 Presenter 属性,并使用 onSucess、onError、onStart、onComplete 或类似的东西以及 Otto 的相同事件(onSucessEvent、onErrorEvent、onStartEvent、onCompleteEvent)实现一些 MvpView 接口.
所以当我需要做某事时 Activity 或 Fragment 将启动服务,服务将 "start" 或与 Presenter 交谈,当 Presenter 成功完成时将调用 mvpView.onSuccess() 并使用 SQLite(可能是 storeIO)将信息存储在本地数据库中,最后服务将调用 Otto 并传递信号(上面没有任何数据),可能是 onComplete。
最后,信号将被我的 UI(可能是片段)捕获,并在 SQLite 中检索数据库中的所有信息。
因此,当 onSucess 发生时,UI 将显示最新和最好的数据,但是当 onError 发生时,将(至少)显示一些信息(如果你想要,也可以不显示)对用户说 "there was a problem but at least you can see something", bot onSuccess 和 onError 毕竟会调用 onComplete。
不知道这是否是最佳解决方案,但在这种情况下,我认为我不会处理 Activity 或 Fragments 生命周期,也不关心用户旋转设备时的 onSaveInstance 和恢复数据。它将始终获取数据库中的最新数据,如果发生某些事情(没有互联网连接),您至少可以在收到 onComplete 信号时显示一些内容。
一些我还在思考的事实:
- Presenter 不会是单身人士class
- Presenter 对 Context 一无所知,但对 MyApplication 了解 class
- 如果对于一个屏幕(片段)您有不同的服务和不同的 onSuccessEvents 会怎样?只需使用某种动作作为 ID,即可识别它们。
- 永远不要让 Activity Fragment 实现 MvpView,你将不得不处理生命周期。
这篇文章在类似的情况下帮助了我,虽然可能不完全是你的,但思路是一样的:
https://android.jlelse.eu/android-bound-services-and-mvp-12ca9f70c7c7
基本上,作者解决了绑定服务与 activity 紧密耦合的事实,并为其添加了额外的生命周期调用。
我正在开发一个 Android 应用程序来进行人类 Activity 识别。
它基本上是这样工作的-服务不断读取加速器数据并将识别的activity(即步行,运行)存储在数据库中。用户可以在 activity 中的 ListView
中看到所有已识别的活动(访问数据库)。数据库中的每个用户 table 都有一个 pa_goal(物理 activity 目标)字段,服务从数据库中读取该字段并进行一些检查。
用户当然可以从 activity 更改此目标。因为我将实施 MVP 架构模式。
我不确定将服务放在哪里?它肯定不是视图。有什么建议吗?
在一个干净的架构中,这就是我假设您使用 MVP 的目的,存在将框架与业务逻辑分离的想法。这基本上是普通演示者允许您执行的操作。
在这种情况下,它不是您正在处理的视图,但原理是相似的。当您可以将它们分开以获得更好、更单一的责任 class 时,您不希望所有业务或应用程序逻辑都混合在 Android 代码中。所以我想说,虽然它不是一个视图,但您仍然应该有一个演示者类型 class(也许最好称为控制器或经理)。
这 class 将是一个 POJO,它控制您的服务的行为方式,可以使用标准的 junit 测试和服务模拟轻松测试。然后可以将此 class 和服务放入其自己的功能包中,并以与演示者相同的方式与后端模型交互。
因此,总而言之,该角色是您应用的另一个功能,它与其他功能(根据我的经验通常只是视图)并排放置。
希望对您有所帮助
我也是这种情况。最后我决定做这样的事情:
活动或片段超出范围,他们对 MVP 一无所知,但我将使用像 Otto 这样的事件总线来发送 signals/events,所以:
我的 classes 扩展了某种 Presenter 对 Android Context 一无所知,但它们将有一个 MvpView 接口,只有 onAttachPresenter 和 onDetachPresenter。
扩展 Service 的 class 将具有 Presenter 属性,并使用 onSucess、onError、onStart、onComplete 或类似的东西以及 Otto 的相同事件(onSucessEvent、onErrorEvent、onStartEvent、onCompleteEvent)实现一些 MvpView 接口.
所以当我需要做某事时 Activity 或 Fragment 将启动服务,服务将 "start" 或与 Presenter 交谈,当 Presenter 成功完成时将调用 mvpView.onSuccess() 并使用 SQLite(可能是 storeIO)将信息存储在本地数据库中,最后服务将调用 Otto 并传递信号(上面没有任何数据),可能是 onComplete。 最后,信号将被我的 UI(可能是片段)捕获,并在 SQLite 中检索数据库中的所有信息。
因此,当 onSucess 发生时,UI 将显示最新和最好的数据,但是当 onError 发生时,将(至少)显示一些信息(如果你想要,也可以不显示)对用户说 "there was a problem but at least you can see something", bot onSuccess 和 onError 毕竟会调用 onComplete。
不知道这是否是最佳解决方案,但在这种情况下,我认为我不会处理 Activity 或 Fragments 生命周期,也不关心用户旋转设备时的 onSaveInstance 和恢复数据。它将始终获取数据库中的最新数据,如果发生某些事情(没有互联网连接),您至少可以在收到 onComplete 信号时显示一些内容。
一些我还在思考的事实:
- Presenter 不会是单身人士class
- Presenter 对 Context 一无所知,但对 MyApplication 了解 class
- 如果对于一个屏幕(片段)您有不同的服务和不同的 onSuccessEvents 会怎样?只需使用某种动作作为 ID,即可识别它们。
- 永远不要让 Activity Fragment 实现 MvpView,你将不得不处理生命周期。
这篇文章在类似的情况下帮助了我,虽然可能不完全是你的,但思路是一样的:
https://android.jlelse.eu/android-bound-services-and-mvp-12ca9f70c7c7
基本上,作者解决了绑定服务与 activity 紧密耦合的事实,并为其添加了额外的生命周期调用。