ANDROIDLNPUT І ACCELEROMETERHANDLER

Інтерфейс Input, за допомогою декількох зручних методів надає нам доступ до акселерометру, сенсорному екрану і клавіатурі в режимі опитування та режимі подій Поміщати весь код для реалізації даного інтерфейсу в один файл трохи незручно, тому ми винесемо всю обробку подій введення в окремі обробники Реалізація Input буде використовувати дані обробники, щоб створювати видимість того, що саме вона виконує всю роботу

AccelerometerHandler: що зверху

Почнемо з найпростішого з усіх обробників – з AccelerometerHandler (лістинг 55)

Лістинг 55 AccelerometerHandlerJava виконання обробки, повязаної з акселерометром

Не дивно, що даний клас застосовує інтерфейс SensorEventLi stener Цей клас зберігає три змінні, запамятовуючи інформацію про прискорення по кожній з трьох осей акселерометра

Конструктор приймає Context, з якого отримує екземпляр класу SensorManager, щоб почати слухати події Зверніть увагу, що якщо акселерометр відсутня, то обробник буде весь час вважати, що прискорення по всіх осях дорівнює нулю, а нам ні до чого додаткова перевірка на наявність помилок або код для генерації виключень

Наступні два методи – onAccuracyChangedO і onSensorChanged – також повинні бути вам вже знайомі У першому ми в даному випадку нічого не робимо, тому що тут не про що повідомляти Використовуючи другий метод, ми вибираємо дані акселерометра з прийнятого SensorEvent і зберігаємо їх в членах обробника

Останні три методи повертають поточні значення прискорення по кожній з осей

Зверніть увагу, що ми не займаємося тут-якої синхронізацією, навіть незважаючи на те, що метод onSensorChanged може бути реалізований в окремому потоці Модель памяті Java гарантує, що операції запису та зчитування з примітивних типів даних, таких як boolean, int або byte, є атомарними У даному випадку можна покластися на цей факт, так як ми не робимо нічого складного, а просто присвоюємо нове значення В іншому випадку, наприклад, якщо б ми оперували змінними екземпляра в методі onSensorChangedC), нам знадобилася б гарна синхронізація Клас Pool: використовуємо повторно

Яка найжахливіша річ може трапитися при програмуванні під Android Безсумнівно, це всеостанавлівающая збірка сміття Якщо звернути увагу на визначення інтерфейсу Input, то відразу будуть помітні методи getTouchEventsC) і getKeyEvents Вони повертають списки TouchEvents і KeyEvents У наших обробниках подій клавіатури і сенсорного екрана ми будемо постійно створювати екземпляри цих двох класів і зберігати їх у внутрішніх списках обробників Система введення Android постійно генерує безліч подій при торканні екрану або натисканням клавіші, тому нам довелося б безперервно створювати нові екземпляри класів, які підхоплювалися б складальником сміття через невеликі проміжки часу Щоб цього уникнути, реалізуємо концепцію, відому як пулинг екземплярів (instance pooling) Замість того щоб постійно створювати нові екземпляри класу, ми просто будемо використовувати раніше створені екземпляри Клас Pool – це зручний спосіб реалізувати подібну поведінку програми Розглянемо його код в лістингу 56

Лістинг 56 Pooljava вчимося поводитися зі складальником сміття package combadl ogi сandroi dgamesframework

Тепер в хід підуть дженерики: перша річ, яку необхідно врахувати, – те, що даний клас характеризується узагальненої типізацією (generically typed) подібно класам колекцій, таким як ArrayLi st або HashMap Дженерик дозволяє зберігати обєкт будь-якого типу в нашому Pool, не витрачаючи часу на зайві операції приведення Так що ж робить клас Pool

Для початку визначимо інтерфейс Pool Ob jectFactory, який знову-таки є дженеріком Він використовує тільки один метод, createObject, який повертає новий узагальнений тип екземпляра класу Pool /PoolObjectFactory

Клас Pool включає в себе три члена: ArrayList, що зберігає обєкти пулу, PoolObjectFactory, який генерує нові екземпляри типу, що міститься в класі, і ще один член, який зберігає максимальну кількість обєктів, яке може містити в собі Pool Останній елемент необхідний для того, щоб уникнути неконтрольованого зростання Pool, інакше може виникнути виняток нестачі памяті

Конструктор класу Pool приймає PoolObjectFactory і максимальна кількість обєктів, яке він може зберігати Ми зберігаємо обидва параметри у відповідних змінних і створюємо новий ArrayList, місткість якого дорівнює максимальній кількості обєктів

Метод newObject відповідає або за передачу нового екземпляра класу даного типу, який Pool отримав через метод PoolObjectFactorynewObjectO, або за те, щоб повернути узагальнений екземпляр, якщо він вже Тобто, в freeObjects ArrayLi st Якщо ми використовуємо даний метод, то отримаємо заново оброблені обєкти за умови, що Pool вже зберігає декілька таких обєктів у списку freeObjects В іншому випадку метод створить новий обєкт за допомогою фабрики

Метод fгее дозволяє переставляти обєкти, які ми більше не використовуємо Він просто вставляє обєкти в список freeObjects, звичайно, якщо той не заповнений повністю Якщо список сповнений, обєкт не буде доданий Швидше за все, його підбере збирач сміття, коли буде запущений наступного разу

Як же ми можемо використовувати цей клас Розглянемо псевдокод, який показує застосування класу Pool при обробці торкань на екрані:

Спочатку визначаємо PoolObjectFactory, який створює екземпляри класу TouchEvent Далі створюємо Pool і вказуємо йому використовувати нашу фабрику і одночасно зберігати не більше 50 подій TouchEvent Коли нам потрібен новий TouchEvent з Pool, використовуємо метод newObject, що відноситься до Pool Спочатку Pool порожній, тому він попросить фабрику створити новий екземпляр класу TouchEvent Коли ми більше не потребуємо в TouchEvent, ми можемо повернути його в Pool х за допомогою методу Pool freeO Наступного разу, коли ми використовуємо метод newObjectO, ми знову отримаємо цей же екземпляр класу TouchEvent і знову його задіємо Таким чином, в даній ситуації ми обійдемося без збирача сміття Даний клас зручно застосовувати в багатьох ситуаціях Просто запамятайте, що потрібно бути уважними, якщо ви багато разів використовуєте обєкти Якщо ви берете їх із класу Pool, то їх повторна ініціалізація, можливо, вийде неповною, а цього допускати не можна

Джерело: Mario Zechner / Маріо Цехнер, «Програмування ігор під Android», пров Єгор Сидорович, Євген зазноби, Видавництво «Пітер»

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*