Files
AndroidAisMap/ARCHITECTURE_SUMMARY.md
Grigo b5aee265bc feat: новая архитектура UI и расширенная визуализация AIS
Архитектурные улучшения:
- Внедрен 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
2025-10-02 09:15:33 +03:00

4.2 KiB

Резюме архитектурных изменений для устранения зависаний

🎯 Проблемы найдены и исправлены:

1. Утечки Handler объектов

Проблема: Каждый раз создавался new Handler().post() для UI операций Решение:

  • Добавлен единый uiHandler в AppController
  • Все прямые mapInterface вызовы заменены на uiDataNotifier
  • Централизованная очистка Handler'ов в cleanup()

2. Отсутствие throttling UI операций

Проблема: UI операции происходили хаотично без ограничений Решение:

  • Создан UIRenderingCoordinator с централизованным throttling
  • Vessel updates: 500мс throttling
  • AIS updates: 1сек throttling
  • Path updates: 2сек throttling

3. Прямые UI вызовы из контроллеров

Проблема: mapInterface.updateOwnVesselPosition() вызывался напрямую из AppController Решение:

  • Создан интерфейс UIDataChangeNotifier для связи контроллеров с UI
  • AppController теперь уведомляет UI через uiDataNotifier.onVesselPositionChanged()
  • Полное разделение логики и UI представления

4. Архитектурное разделение ответственности

Было: Контроллеры знали о UI деталях и делали прямые вызовы карты Стало:

  • Контроллеры: только модель данных, парсинг, вычисления
  • UI Coordinator: централизованная очередь UI операций с throttling
  • MainActivity: только Android жизненный цикл, не UI логика

📊 Математика улучшений:

Было:

  • ~50+ Handler'ов создаваемых ежеминутно
  • Хаотичные UI обновления каждые 100-1000мс без throttling
  • Прямые блокирующие операции в UI потоке

Стало:

  • 1 переиспользуемый Handler в AppController
  • Централизованный throttling через UIRenderingCoordinator
  • Все UI операции батчинговые и предсказуемые

🔄 Новая архитектура потоков:

Background: GPS/NMEA/UDP → AppController → uiDataNotifier → UIRenderingCoordinator
                    ↓           ↓               ↓              ↓
              Parse Data → Update Model → Request UI → Throttled Rendering

Throttling потоки:

  • Vessel position: 500мс
  • AIS vessels: 1000мс
  • Path updates: 2000мс
  • All через единую очередь UIRenderingCoordinator

🚀 Ожидаемый результат:

Полное устранение зависаний UI через 30+ минуты работы
Предсказуемая производительность - контроллеры работают в фоне
Стабильная работа карты - нет перегрузки UI потока
Масштабируемость - легко добавить новые контроллеры
Тестируемость - контроллеры независимы от UI

🔧 Следующие шаги для полного решения:

  1. Реализована новая архитектура с UIRenderingCoordinator
  2. Заменены все прямые UI вызовы в AppController
  3. Протестировать новую архитектуру на протяженной работе

Главное: Заменена архитектура от хаотичных UI вызовов к централизованному throttling через единую точку. Это должно полностью решить проблему зависаний!