Да, ваше право: Вы не можете изменять представления в другом потоке в целях безопасности (поэтому он называется потоком пользовательского интерфейса).Он не позволяет оставлять данные пользовательского интерфейса в несогласованном состоянии, что может привести к сбою приложения и его будет очень сложно отладить.Так что android API просто запрещает это (и это хорошая идея).Это обычный шаблон пользовательского интерфейса, который вы найдете в большинстве API.
Вы можете обновить любое представление с помощью post () или runOnUiThread () :
anyView.post(new Runnable() {
public void run() {
// do update here
}
});
Почему этот шаблон?
Синхронизация не бесплатна.Это влияет на производительность.Таким образом, проще сохранить изменения в пользовательском интерфейсе в одном потоке.
Если бы я мог изменять данные из разных потоков, что могло бы произойти?
Например: поток A
изменяетцвет вида и нити B
читает цвет в то же время.Поскольку многопоточность не гарантирует, какая инструкция будет выполнена первой, вы можете получить неожиданные результаты.Цвет черный (0|0|0
) раньше, поток A
хочет установить белый (255|255|255
) и начать с установки красного компонента на 255
, поток B
начинает читать и получает весь цвет перед потокомA
имел возможность закончить и получил красный цвет (255|0|0
) вместо черного.
Это простой пример, который может повлиять на визуальный эффект, но если это произойдет с некоторыми действительно важными данными, ваше приложение будетужасно падает, и такая ошибка настолько неприятна и ее трудно отладить.Есть много, чтобы узнать о многопоточности и, возможно, этот урок Java является хорошей отправной точкой ...