generated from Grigo/AndroidTemplate
b5aee265bc
Архитектурные улучшения: - Внедрен UIRenderingCoordinator с централизованным throttling - Решены проблемы зависания UI через батчинг операций карты - Добавлен VesselPathController для отслеживания маршрутов - Реализован MapLibreMapImpl как альтернатива Яндекс.Картам Визуализация AIS: - Добавлены векторные иконки для всех типов судов - Разделение Class A/B судов с соответствующими иконками - Иконки навигационных статусов (anchor, moored, engine, sail) - Улучшенный CursorOverlay с информацией о судах Производительность: - Throttling UI обновлений (vessel: 500ms, AIS: 1s, paths: 2s) - Устранение утечек Handler объектов - Оптимизация GeoJSON операций в MapLibre
78 lines
3.5 KiB
Markdown
78 lines
3.5 KiB
Markdown
# Новая архитектура приложения
|
|
|
|
## Проблемы текущей архитектуры:
|
|
|
|
1. **AppController смешивает логику и UI**:
|
|
- `mapInterface.updateOwnVesselPosition()` вызывается напрямую
|
|
- `uiHandler.post(() -> mapInterface.addAISVesselMarker())`
|
|
- Контроллеры знают о UI деталях
|
|
|
|
2. **Нет единого поток UI операций**:
|
|
- Каждый контроллер делает свои UI вызовы
|
|
- Нет централизованного throttling для карты
|
|
- Перегрузка UI потока
|
|
|
|
## Новая архитектура:
|
|
|
|
### 1. **Контроллеры (Background Threads)**:
|
|
- Только **обновляют модель данных** (ownVessel, aisVessels)
|
|
- Только **вычисления** (paths, predictions, compass)
|
|
- Только **парсинг данных** (NMEA, GPS, UDP)
|
|
- **Не знают** о UI карте
|
|
|
|
### 2. **UI Coordinator (Main Thread)**:
|
|
- **Единая точка** всех UI операций
|
|
- **Централизованный throttling** (500мс, 1сек)
|
|
- **Батчинг** операций карты
|
|
- **Координация** между контроллерами и UI
|
|
|
|
### 3. **Data Flow**:
|
|
|
|
```
|
|
Background Threads → Model Updates → UI Coordinator → Throttled Map Updates
|
|
↓ ↓ ↓ ↓
|
|
NMEA/GPS ownVessel Batched UI MapLibre
|
|
Parsing AIS Data Operations Rendering
|
|
```
|
|
|
|
## План реализации:
|
|
|
|
### Этап 1: Создать UI Coordinator
|
|
```java
|
|
public class UIRenderingCoordinator {
|
|
private MapInterface mapInterface;
|
|
private Handler uiHandler;
|
|
private Runnable batchedUpdateRunnable;
|
|
private Set<String> pendingVesselUpdates;
|
|
private Map<String, AISVessel> pendingAISUpdates;
|
|
|
|
void requestVesselUpdate(Vessel vessel) { /* add to pending */ }
|
|
void requestAISUpdate(AISVessel vessel) { /* add to pending */ }
|
|
void executeBatchUpdate() { /* throttled map rendering */ }
|
|
}
|
|
```
|
|
|
|
### Этап 2: Рефакторить AppController
|
|
- Убрать все `mapInterface.*` вызовы
|
|
- Только обновлять `ownVessel` данные
|
|
- Уведомлять `UIRenderingCoordinator` через интерфейс
|
|
- Никаких `uiHandler.post()` в контроллерах
|
|
|
|
### Этап 3: Установить throttling
|
|
- Все UI операции → UI Coordinator
|
|
- Throttling 500мс для критичных операций
|
|
- Throttling 1сек для некритичных (paths, compass)
|
|
|
|
### Этап 4: Батчинг операций
|
|
- Собирать все изменения за период throttling
|
|
- Одним вызовом обновить всю карту
|
|
- Минимизировать количество `mapInterface` вызовов
|
|
|
|
## Ожидаемый результат:
|
|
|
|
✅ **Стабильная производительность** - контроллеры работают в фоне
|
|
✅ **Предсказуемые зависания** - все UI операции через единую точку
|
|
✅ **Масштабируемость** - легко добавить новые контроллеры
|
|
✅ **Тестируемость** - контроллеры не зависят от UI
|
|
✅ **Производительность** - минимум UI операций, максимум батчинга
|