Android - Рисование вне экрана из потока, не относящегося к пользовательскому интерфейсу

Короткая версия

Разрешено ли это, или мне нужно использовать поток пользовательского интерфейса?

РЕДАКТИРОВАТЬ: ссылка на место в официальных документах по Android была бы идеальной.

Длинная версия

В документации по Android четко указано, что «доступ к инструментарию пользовательского интерфейса Android извне из потока пользовательского интерфейса» запрещен.

С другой стороны, создание объектов Bitmap из рабочих потоков кажется разрешенным, по крайней мере, это делается в примере кода: http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html По-видимому, класс Bitmap не считается частью" пользовательского интерфейса ". набор инструментов », что касается нарезания резьбы.

У меня есть фрагмент кода, который кажется работает при вызове из потока, отличного от пользовательского интерфейса. Он включает использование Bitmap.createBitmap (int, int, Bitmap.Config), new Canvas (растровое изображение), Typeface.create () и рисование текста. Мой код не относится ни к какому объекту View.

Может ли кто-нибудь указать мне на часть документации, в которой говорится, что я могу делать эти вещи из фонового потока? Или это приведет к случайным сбоям?


person wolfgang    schedule 27.11.2011    source источник


Ответы (3)


Набор инструментов пользовательского интерфейса означает пользовательские интерфейсы, такие как кнопки, ярлыки, список и т. Д., Предоставляемые Google. Вы не можете получить к ним доступ из потока, отличного от пользовательского интерфейса, в основном потому, что они не являются потокобезопасными.

То, что вы делаете, находится не в наборе инструментов пользовательского интерфейса, а на низкоуровневом холсте, к которому разрешен (на самом деле должен быть разрешен) доступ из потоков, отличных от пользовательского интерфейса. Этот механизм постоянно используется при разработке игр. Так что я верю, что ты в безопасности.

person Tae-Sung Shin    schedule 27.11.2011
comment
Я добавил более сильную потребность в ссылке на документацию по этому вопросу. Я приму этот ответ, если не получу ... - person wolfgang; 27.11.2011
comment
Эта статья, кажется, просто сообщает основной теме, чтобы аннулировать представление игры. - person wolfgang; 28.11.2011

Обновление представлений должно выполняться в потоке пользовательского интерфейса или из удаленного потока с помощью функции публикации (которая в основном сообщает потоку пользовательского интерфейса, что удаленный поток хочет, чтобы что-то было сделано), которая является частью класса View.

person Jakub Szczygieł    schedule 27.11.2011

Это должно быть законно, поскольку растровые изображения просто остаются в памяти сами по себе, прежде чем вы их начнете рисовать.

Я изучаю разработку игр, кажется, есть несколько потоков, обновляющих пользовательский интерфейс (с использованием аналогичной техники рендеринга в памяти)

person zmbq    schedule 27.11.2011
comment
Это должно быть, но опять же, код рендеринга шрифтов Android, вероятно, использует некоторые общие структуры данных. Они потокобезопасны? - person wolfgang; 27.11.2011
comment
Вряд ли мы обнаружили, что этот код даже не пытается быть потокобезопасным: stackoverflow.com/questions/8288155/ - person miguel.de.icaza; 27.03.2015