Android MVVM + BLE: должна ли логика управления соединениями находиться в службе переднего плана или в репозитории? [закAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android MVVM + BLE: должна ли логика управления соединениями находиться в службе переднего плана или в репозитории? [зак

Сообщение Anonymous »

Я разрабатываю приложение для Android, которое подключается к периферийному устройству через BLE. Я использую архитектуру MVVM с Kotlin Flow.
В настоящее время я реализовал ForegroundService для поддержания жизненного цикла соединения (независимо от пользовательского интерфейса). ViewModel подписывается на потоки, предоставляемые этой службой, для наблюдения за состоянием соединения.
Моя архитектурная дилемма заключается в том, где разместить логику соединения (сканирование, подключение, обработка тайм-аута).
Текущая реализация:
Служба хранит ссылку на BluetoothRepository посредством внедрения зависимостей. Сервис активно управляет логикой сканирования и подключения с помощью сопрограмм, тогда как Репозиторий предоставляет только низкоуровневые методы.
Например, внутри Сервиса:

Код: Выделить всё

// 1. Scan logic inside Service
scanJob = serviceScope.launch {
withTimeoutOrNull(20000L) {
bluetoothRepository.getScanFlow(ScanSettings.Builder().build())
.catch { e ->
Log.e(TAG, "Scan error", e)
}
.collect { device ->
if (device == null) return@collect
Log.d(TAG, "Device scanned: ${device.name}")
updateScannedDevices(ScannedDevice(device))
}
}
// Handle timeout
updateConnectionState(BluetoothState.DisConnected)
}

// 2. Prerequisites check inside Service
val openResult = bluetoothRepository.ensureBluetoothAndLocationEnabled()
Определение репозитория выглядит следующим образом:

Код: Выделить всё

interface BluetoothRepository {
fun getScanFlow(settings: ScanSettings): Flow
suspend fun connectToTargetDevice(device: BluetoothDevice)
suspend fun ensureBluetoothAndLocationEnabled(): Boolean
}
Вопрос:
1. Разделение задач: правильно ли для Службы активно координировать эти потоки (обработка таймаутов, сбор результатов и обновление собственного состояния) или этот «конечный автомат соединения» должен быть полностью инкапсулирован в репозиторий? Если Репозиторий управляет логикой, какова будет конкретная ответственность Службы?
Направление зависимости: В настоящее время Служба зависит от Репозитория (Сервис -> Репозиторий). Существует ли стандартный архитектурный шаблон, в котором репозиторий зависит от службы (или контекста) для управления соединениями BLE, учитывая, что соединение BLE должно пережить разрушение пользовательского интерфейса?
2. Поток данных: в подходе с чистой архитектурой должна ли ViewModel наблюдать за репозиторием напрямую (минуя службу), или служба действует как необходимая оболочка для обеспечения контекста фонового выполнения, требуемого BLE?
3. Я ищу ответы на основе Android лучшие архитектурные практики (чистая архитектура, примеры Google) и способы правильной обработки зависимостей жизненного цикла между BLE, службами и репозиториями.

Подробнее здесь: https://stackoverflow.com/questions/798 ... eground-se
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»