Вопрос про отображение данных получаемых из потоков

Ответить
Rustam
Сообщения: 40
Зарегистрирован: 13 апр 2014, 11:38

Вопрос про отображение данных получаемых из потоков

Сообщение Rustam » 02 мар 2015, 14:18

Здравствуйте!
Суть программы:
есть устройство, которое по Wifi сети посылает данные 10 раз в сек, причем иногда посылает данные об ошибке какой-либо,
их надо отобразить
для отображения данных используется canvas LinearLayout-а - так как они графические
для отображения ошибок используется полупрозрачный AlertDialog, который отображается поверх canvas

1 путь:
один поток, в котором опрашиваю Socket и получаю данные, потом все отрисовываю
отрисовка canvas идет с помощью .postInvalidate(), отображение AlertDialog-a с помощью runOnUiThread из самого потока
минусы:
если оставить приоритет потока стандартным(т.е. не менять) то экранные компоненты тормозят, кнопку не нажмешь, контектстное меню вызывается с жуткими тормозами(а настройки приложения надо менять в процессе его работы)
AlertDialog отображается также с тормозами.
если ставить приоритет ниже среднего, то экранные компоненты живо реагируют, но данные обновляются хуже некуда, если приоритет поставить выше среднего, данные обновляются, но с тормозами(также как и при нормальном приоритете), а про нажатие на экранные компоненты можно забыть

2 путь:
сделал два сервиса Executors.newSingleThreadScheduledExecutor(), которые вызываются каждые 100 мс - то есть 10 раз в сек
в одном данные обновляются - запускается поток для Socket-a, в другом данные обрабатываются и выводятся, тоже каждые 100 мсек
проблем с экранными компонентами нет, но сохранился МИНУС AlertDialog отображается также с тормозами

если кто сталкивался то скажите как обошли этот вопрос
приложение по сути должно делать 2 простые вещи -
каждые 100мсек отображать данные, если прилетело сообщение об ошибке то всплывает AlertDialog

Rustam
Сообщения: 40
Зарегистрирован: 13 апр 2014, 11:38

Re: Вопрос про отображение данных получаемых из потоков

Сообщение Rustam » 12 мар 2015, 23:52

Rustam писал(а):Здравствуйте!
Суть программы:
есть устройство, которое по Wifi сети посылает данные 10 раз в сек, причем иногда посылает данные об ошибке какой-либо,
их надо отобразить
для отображения данных используется canvas LinearLayout-а - так как они графические
для отображения ошибок используется полупрозрачный AlertDialog, который отображается поверх canvas

1 путь:
один поток, в котором опрашиваю Socket и получаю данные, потом все отрисовываю
отрисовка canvas идет с помощью .postInvalidate(), отображение AlertDialog-a с помощью runOnUiThread из самого потока
минусы:
если оставить приоритет потока стандартным(т.е. не менять) то экранные компоненты тормозят, кнопку не нажмешь, контектстное меню вызывается с жуткими тормозами(а настройки приложения надо менять в процессе его работы)
AlertDialog отображается также с тормозами.
если ставить приоритет ниже среднего, то экранные компоненты живо реагируют, но данные обновляются хуже некуда, если приоритет поставить выше среднего, данные обновляются, но с тормозами(также как и при нормальном приоритете), а про нажатие на экранные компоненты можно забыть

2 путь:
сделал два сервиса Executors.newSingleThreadScheduledExecutor(), которые вызываются каждые 100 мс - то есть 10 раз в сек
в одном данные обновляются - запускается поток для Socket-a, в другом данные обрабатываются и выводятся, тоже каждые 100 мсек
проблем с экранными компонентами нет, но сохранился МИНУС AlertDialog отображается также с тормозами

если кто сталкивался то скажите как обошли этот вопрос
приложение по сути должно делать 2 простые вещи -
каждые 100мсек отображать данные, если прилетело сообщение об ошибке то всплывает AlertDialog
в итоге если кому понадобиться:
1. для периодических задач - использовался сервис
2. для отрисовки больших данных использовать другой SurfaceView - много в сети иныф по этому
3. вместо AlertDialog - сделал иначе: после отрисовки всей канвы - просто делаю заполнение полупрозрачное и потом на нем пишу текст - визуально получается, что как-будто поверх вылезло окно :)

Ответить