#android #multithreading
#Android #многопоточность
Вопрос:
Инструментарий пользовательского интерфейса Andoid не является потокобезопасным, при попытке изменить пользовательский интерфейс из рабочего потока вы получаете CalledFrowWrongThreadException
(или что-то в этом роде).
Более того, в руководстве разработчика говорится:
[Управление пользовательским интерфейсом из рабочего потока] может привести к неопределенному и неожиданному поведению, отследить которое может быть сложно и отнимать много времени.
Но мне не кажется очень сложным понять, что CalledFrowWrongThreadException
означает.
Была ли документация написана до внедрения CalledFrowWrongThreadException
или все еще есть случаи, когда исключение не выдается? (или где ошибка действительно сложна и требует много времени для отслеживания)
Ответ №1:
Основная проблема здесь заключается в том, что проверка того, какой поток вызывает данную функцию, влечет за собой накладные расходы на обработку; почти наверняка есть вызовы, которые не проверяют именно по этой причине — это замедлило бы рендеринг пользовательского интерфейса.
В более широком смысле, причина, по которой функции пользовательского интерфейса не являются потокобезопасными, заключается в том, что если вы добавляете код мьютекса в уравнение, снижение производительности становится еще большим.
Ответ №2:
Точно так же, как Swing в Java и WinForms в .NET, могут быть случаи, когда рассматриваемый метод не проверяет, вызываете ли вы из соответствующего потока, и, следовательно, не обязательно выдает ожидаемое исключение.
Предоставление вышеуказанной документации — это способ прикрыться и объяснить простую идею, которая на самом деле требует больших усилий, чтобы обойти ее, если вы ее не знаете или не понимаете, до того, как из-за некорректного кода возникнет исключение неправильного потока, что может произойти гораздо позже в будущем.