tgoop.com/dev_easy_notes/15
Last Update:
Начнем серию постов с темы: «как работает UI с точки зрения многопоточности🧵».
Представьте прогу с одним потоком, все легко и прозрачно, не нужно думать про многопоточность и про все её проблемы🦄. Однако есть минус, пока прога работает, пользователь просто ждет и ничего не может сделать (напоминает Россию).
Ок, увеличим количество потоков, теперь приложение отзывчивое, и можно делать задачи параллельно, в чем проблема?
Проблема в том, что у нас есть UI слой, на котором мы двигаем и рисуем кнопки, возникает вопрос, как его обновлять из разных потоков? В голову приходит два решения:
☝️Просто сделать все View многопоточными и тогда их можно будет обновлять откуда угодно и не париться.
✌️Выделить для UI один специальных поток, и обновлять только через него.
🦾 Лучшие инженеры в свое время пытались сделать 1-й вариант и все попытки провалились. Как показала практика почти нереально сделать так, чтобы View была многопоточной, было бы безумно сложно не словить DeadLock
.
🧐 Представьте что вы на View делаете переменную isAnimationRunning
, а теперь она может меняться из разных потоков, сейчас она true
, а через мгновение уже false
. А если просто навесить по всюду synchronized
, то очень сильно просядет производительность.
😅 Со специальным потоком гораздо проще, но вопрос по прежнему актуальный, как менять UI из других потоков? На помощь приходит старый добрый паттерн Consumer/Producer. В частности в Android он реализован за счет троицы пацанов Looper, Handler, MessageQueue
, о которых так любят спрашивать на собесах и о которых мы поговорим далее…
BY Dev Easy Notes

Share with your friend now:
tgoop.com/dev_easy_notes/15