2015-07-21 3 views
0

В Android я использую SurfaceView. Он находится внутри FrameLayout, чтобы нарисовать пару вещей на прозрачном слое поверх общей компоновки XML (со стандартными текстовыми элементами, кнопками и т. Д.). Рисунок не требует очень интенсивного вычисления и не оживляет, он только обновляет в ответ на нажатия кнопок.Нужно ли использовать отдельный поток при использовании SurfaceView?

Все примеры, которые я видел в SurfaceView, используют отдельный поток для рисования, а затем закрывают этот поток в OnSurfaceDestroyed.

Мой код работает без использования отдельного потока, но иногда он вылетает/зависает, особенно при переключении между ориентациями/приложениями.

Итак, мой вопрос: нужно ли использовать дополнительный поток, чтобы предотвратить эти сбои. А если нет, есть ли какая-то другая особенность, которую я должен делать в OnSurfaceDestroyed? (Я бы предпочел не размещать весь мой код здесь, просто ищет простой ответ «да/нет» и причины в нескольких предложениях).

ответ

2

У вас нет необходимо, чтобы иметь отдельную тему, но часто это хорошая идея.

Например, обратите внимание на Grafika's "multi-surface test" Деятельность. Он имеет три перекрывающих SurfaceViews, которые отображаются из потока пользовательского интерфейса. Если вы нажмете на кнопку «bounce», она начнет новый поток для управления анимацией, потому что это проще сделать (он может сидеть в цикле и рисовать, вместо того, чтобы публиковать события с временным событием в петле для пользовательского интерфейса) , Поток отказов останавливается, когда действие приостановлено. Обратите внимание, что код ничего не делает в surfaceDestroyed().

Взаимодействие между SurfaceView и жизненным циклом активности может быть сложным. Обсудить можно здесь here.

(Это can be tricky, чтобы получить все правильно.)

+1

Спасибо, что действительно полезно. – stantronic

Смежные вопросы