清洁架构中的 Android 特定代码

8

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

  1. 我想知道的是,处理加速器、地理围栏、位置、短信等代码应该放在哪里?我的初步想法是将它们放在单独的仓库中。但由于这些是分开的长时间运行的过程,可以启动或停止,所以感觉不太对。我尝试将这些类从仓库重命名为服务,只是为了更清楚地表达意图。但仍然感觉有点不对。有什么好的替代方案吗?

  2. 为了能够接收发送的短信状态,我需要注册一个接收器。谁应该负责这个?当SmsRepository收到发送短信的调用时,它自己应该注册接收器、发送消息并释放接收器,还是UseCase首先要检查SmsRepository是否启动,如果没有,则启动它,因此注册接收器,然后调用sendSms()方法?还是可能应该采取另一种方法,在应用启动时注册接收器并在关闭时注销接收器?

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

enter image description here

编辑:4. 如果您希望不断监听服务器结果,该怎么办?您是否直接从ViewModel订阅仓库,还是在它完成后保持调用相同的UseCase(其目的是获取一次结果)?我对UseCase的理解是它只返回单个结果,不应该是可订阅的。

1个回答

2

我的谦虚意见:

1)由于加速度计、陀螺仪等都是一种数据源,因此可以将它们放在SensorRepository/SensorDataSource/中(数据层位于域/核心层之外,可以具有Android代码)。当您需要访问它们时,可以通过UseCase类进行访问,在这里您将拥有这些逻辑:采样频率、数据过滤器、格式更改、可能的缓冲区计数等...

将加速度计、陀螺仪和位置放入同一类或不同类中,应该根据功能而不是传感器类型来决定。如果一个功能(例如配置文件)需要同时使用位置和短信,则它们应该在同一类别下。

启动/停止它们可以通过调用StopLocationUseCase、StartLocationUseCase来实现,这将调用那些Repository的start()/stop()等方法... StartLocationUseCase应该是幂等的,如果已经启动了(UseCase会询问Repository),则不会再次启动。

2)知道“短信发送/未发送”状态感觉像是sendSms()操作的一部分。因此,如果可能的话,所有register/send/unregister都应该在sendSms()中同步调用。

3)首选基于功能(甚至项目模块也应该是基于功能的)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接