Просто хочу начать с того, что это отличный сайт, надеюсь, вы, ребята, можете помочь!
Я пытаюсь использовать структуру, изложенную в LunarLander, для создания простой игры, в которой пользователь может перетаскивать некоторые растровые изображения на экране (реальная игра более сложная, но это не важно). Я вырвал ненужные части LanderLander и создал свой собственный растровый рисунок, что-то вроде
BoardThread (an inner class of BoardView):
run()
{
while(mRun)
{
canvas = lockSurfaceHolder...
syncronized(mSurfaceHolder)
{
/* drawStuff using member position fields
in BoardView */
}
unlockSurfaceHolder
}
}
Мой drawStuff просто проходит через некоторые массивы и выбрасывает растровые изображения на холст. Все это прекрасно работает. Затем я хотел начать обработку сенсорных событий, чтобы при нажатии пользователем растрового изображения он выбирался, когда пользователь распаковывал растровое изображение, он отменяется, и если растровое изображение выбирается во время события сенсорного перемещения, растягивается растровое изображение. Я сделал это, прослушав сенсорные события в родительском объекте BoardView BoardActivity и передав их в BoardView. Что-то вроде
In BoardView
handleTouchEvent(MotionEvent e)
{
synchronized(mSurfaceHolder)
{
/* Modify shared member fields in BoardView
so BoardThread can render the bitmaps */
}
}
Это также работает нормально. Я могу без проблем перетаскивать свои плитки по экрану.
Однако, время от времени, когда приложение запускается впервые, и я запускаю свое первое событие касания, handleTouchEvent прекращает выполнение на синхронизированной линии (как показано в DDMS). Цикл рисования активен в течение этого времени (я могу сказать, потому что таймер меняется на экране), и обычно требуется несколько секунд или больше, прежде чем через сенсор проходит множество событий касания, и все снова в порядке.
Для меня это не похоже на тупик, поскольку цикл прорисовки постоянно входит и выходит из своего синхронизированного блока. Разве это не должно позволить потоку обработки событий захватить блокировку на mSurfaceHolder? Что тут происходит? У кого-нибудь есть предложения по улучшению того, как я это структурировал?
Некоторая другая информация. Такое «зависание» происходит только при первом касании после начала действия. Это включает в себя изменение ориентации после вызова restoreState. Кроме того, я могу удалить ВСЕ в синхронизированном блоке в обработчике событий, и он все равно будет зависать при синхронизированном вызове.
Спасибо!