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
3.5 KiB
3.5 KiB
Новая архитектура приложения
Проблемы текущей архитектуры:
-
AppController смешивает логику и UI:
mapInterface.updateOwnVesselPosition()вызывается напрямуюuiHandler.post(() -> mapInterface.addAISVesselMarker())- Контроллеры знают о UI деталях
-
Нет единого поток 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
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 операций, максимум батчинга