首页 > 解决方案 > 干净架构中的 Android 特定代码

问题描述

我已经阅读了多个关于 android 的干净架构教程,但它们都具有非常基本的结构和简单的网络调用,这让我感到疑惑。

  1. 我想知道的是我应该把处理加速度计、地理围栏、位置、短信和类似的代码放在哪里?我最初的想法是将它们放在单独的存储库中。但由于这些是可以启动或停止的独立长时间运行的进程,所以感觉不对。我尝试将这些类从存储库重命名为服务,以便更清楚地表达意图。但似乎还是有点过。什么是一个好的选择?

  2. 为了能够接收发送的短信状态,我需要注册一个接收器。谁应该为此负责?存储库本身是否会在收到对 sendSms() 的调用时注册该接收器,发送消息并释放接收器,或者 UseCase 首先必须检查 SmsRepository 是否已启动,如果未启动,则启动它,从而注册接收器,然后调用 sendSms() 方法?或者也许应该采取另一种方法在应用程序启动时注册接收器并在关闭时取消注册?

  3. 这是一个合适的包结构吗?

在此处输入图像描述

编辑: 4. 如果您想不断收听服务器结果,该怎么办?您是直接从 viewmodel 订阅存储库,还是在完成后继续调用相同的用例(其目的是获取一次结果)?我对 UseCase 的理解是它只返回单个结果并且不应该是可订阅的。

标签: androidclean-architecture

解决方案


我的拙见:

1)由于加速度计,陀螺仪..是一种Data Sources,你可以把它们放在 SensorRepository/SensorDataSource/ (数据层位于域/核心层之外,可以有 Android 代码)。当您需要访问它们时,您可以通过 UseCase 类,您将在其中拥有以下逻辑:采样频率、数据过滤器、格式更改,也许是缓冲区计数等......

要将加速度计、陀螺仪、位置归为相同或不同的类别,应该基于特征来确定,而不是基于传感器类型。如果一个功能(例如配置文件)需要位置和短信,它们应该属于同一类。

可以通过调用 StopLocationUseCase 来启动/停止它们,StartLocationUseCase 将调用这些存储库的 start()/stop() 等... StartLocationUseCase 应该是幂等的,如果已经启动(UseCase 将询问存储库),它将不会启动再次。

2) 了解“已发送/未发送”状态感觉就像是sendSms()操作的一部分。sendSms()因此,如果可能,应同步调用所有注册/发送/取消注册。

3)基于特征是首选(即使项目模块也应该是基于特征的)

4)UseCase 可以返回 Observable 类型的数据类型,但恕我直言,它不应该包含状态。


推荐阅读