Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
gforcer18
1 / 0 / 0
Регистрация: 06.12.2015
Сообщений: 3
#1

Как правильно хранить и обрабатывать TouchEvent в OpenGL-потоке? - Программирование Android

07.12.2015, 13:54. Просмотров 186. Ответов 0
Метки нет (Все метки)

Привет

Описание:
1) События касания TouchEvent добавляются в коллекцию (асинхронный буфер). Это происходит не в GL-потоке.
2) Во время цикла обновления состояния OpenGL.onDraw копирую всю коллекцию записанных событий из буфера (addAll) и вызываю для него clear().

Раньше пользовался Collections.synchronizedList( new ArrayList<TouchEvent> ) для создания асинхронной коллекции, но в момент копирования стало выкидывать исключения типа ConcurrentException.

Вопрос:
Следует использовать Vector для get и set или расширить ArrayList добавив синхронизацию ? Не знаю про Vector потому и спрашиваю.

Пример расширения ArrayList:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
public final class SynchronizedArrayList<E> extends ArrayList<E>
{
    // -------------------------------------------------------- \\
    // ===========================================================
    // Constants
    // ===========================================================
    // ===========================================================
    // Fields
    // ===========================================================
 
    /** Busy status flag **/
    private volatile boolean mBusy;
 
    // ===========================================================
    // Constructors
    // ===========================================================
 
    /**
     * {@link SynchronizedArrayList} constructor<br>
     * @param pCapacity capacity
     */
    public SynchronizedArrayList( final int pCapacity )
    {
        super( pCapacity );
    }
 
    // ===========================================================
    // Getter & Setter
    // ===========================================================
 
    @Override
    public final boolean isEmpty( )
    {
        //Result
        boolean empty = false;
 
        try
        {
            //Wait if busy
            waitOnBusy( );
 
            //Lock
            synchronized( this )
            {
                mBusy = true;
            }
 
            //Add all
            empty = super.isEmpty( );
 
            //Unlock & notifyAll
            synchronized( this )
            {
                mBusy = false;
                notifyAll( );
            }
        }
        catch( final Exception unexpectedException )
        {
            if ( Logger.ENABLED )
                Logger.printError( "SynchronizedArrayList.isEmpty: " + unexpectedException.toString( ) );
 
            unexpectedException.printStackTrace( );
        }
 
        return( empty );
    }
 
    @Override
    public final E get( final int pIndex )
    {
        //Item
        E item = null;
 
        try
        {
            //Wait if busy
            waitOnBusy( );
 
            //Lock
            synchronized( this )
            {
                mBusy = true;
            }
 
            //Get
            item = super.get( pIndex );
 
 
            //Unlock & notifyAll
            synchronized( this )
            {
                mBusy = false;
                notifyAll( );
            }
        }
        catch( final Exception unexpectedException )
        {
            if ( Logger.ENABLED )
                Logger.printError( "SynchronizedArrayList.get: " + unexpectedException.toString( ) );
 
            unexpectedException.printStackTrace( );
        }
 
        return( item );
    }
 
    /**
     * Makes calling thread to wait while {@link SynchronizedArrayList} is busy<br>
     */
    private void waitOnBusy( )
    {
        synchronized( this )
        {
            while( mBusy )
            {
                try{ wait( 100 ); }
                catch( final InterruptedException interruptedException )
                {
                    if ( Logger.ENABLED )
                        Logger.printWarning( "SynchronizedArrayList.waitOnBusy: InterruptedException" );
                }
            }
        }
    }
 
    // ===========================================================
    // Methods for/from SuperClass/Interfaces
    // ===========================================================
 
    @Override
    public final boolean add( final E pItem )
    {
        //Result of adding Item
        boolean addingResult = false;
 
        try
        {
            //Wait if busy
            waitOnBusy( );
 
            //Lock
            synchronized( this )
            {
                mBusy = true;
            }
 
            //Add all
            addingResult = super.add( pItem );
 
            //Unlock & notifyAll
            synchronized( this )
            {
                mBusy = false;
                notifyAll( );
            }
        }
        catch( final Exception unexpectedException )
        {
            if ( Logger.ENABLED )
                Logger.printError( "SynchronizedArrayList.add: " + unexpectedException.toString( ) );
 
            unexpectedException.printStackTrace( );
        }
 
        return( addingResult );
    }
 
    @Override
    public final boolean remove( final Object pItem )
    {
        //Result of removing Item
        boolean removingResult = false;
 
        try
        {
            //Wait if busy
            waitOnBusy( );
 
            //Lock
            synchronized( this )
            {
                mBusy = true;
            }
 
            //Remove
            removingResult = super.remove( pItem );
 
            //Unlock & notifyAll
            synchronized( this )
            {
                mBusy = false;
                notifyAll( );
            }
        }
        catch( final Exception unexpectedException )
        {
            if ( Logger.ENABLED )
                Logger.printError( "SynchronizedArrayList.remove: " + unexpectedException.toString( ) );
 
            unexpectedException.printStackTrace( );
        }
 
        return( removingResult );
    }
 
    // ===========================================================
    // Methods
    // ===========================================================
 
    /**
     * Adds all items to given {@link List}<br>
     * This method use synchronization and waits if {@link SynchronizedArrayList} is busy<br>
     * @param pList {@link List}
     * @param clearCollection if true, after adding all items to given {@link List},<br>
     * this {@link SynchronizedArrayList} will be cleared of all items
     * @throws Exception unexpected exception
     */
    public final void addAllTo( final List<E> pList, final boolean clearCollection ) throws Exception
    {
        try
        {
            //Wait if busy
            waitOnBusy( );
 
            //Lock
            synchronized( this )
            {
                mBusy = true;
            }
 
            //Add all
            pList.addAll( this );
 
            //Clear
            if ( clearCollection )
                super.clear( );
 
            //Unlock & notifyAll
            synchronized( this )
            {
                mBusy = false;
                notifyAll( );
            }
        }
        catch( final Exception unexpectedException )
        {
            if ( Logger.ENABLED )
                Logger.printError( "SynchronizedArrayList.addAllTo: " + unexpectedException.toString( ) );
 
            unexpectedException.printStackTrace( );
            throw unexpectedException;
        }
    }
 
    // ===========================================================
    // Inner and Anonymous Classes
    // ===========================================================
    // -------------------------------------------------------- \\
}
Добавлено через 18 часов 29 минут
Причина сомнений - производительность. Сильно ли Vector дает нагрузку. Ведь в каждом обновлении состояния игры get set могут вызываться до сотни раз, еще и при заполнении Vector в главном потоке приложения.

Добавлено через 7 часов 5 минут
Оба варианты оказались ошибочны. Пересмотрев примеры, понял, как надо.
Используется простой ArrayList, добавление событий и их обработка проходят внутри synchronized-блока. Да, затратно, но работает
Пример добавления события:
Java
1
2
3
4
5
6
7
public final void onTouch( final TouchEvent touchEvent )
{
 synchronized( this )
 {
  mTouchEvents.add( touchEvent );
 }
}
Пример обработки события:
Java
1
2
3
4
5
6
7
8
9
10
11
12
public final void onUpdate()
{
 synchronized( this )
 {
  for( TouchEvent touchEvent : mTouchEvents )
   {
    ...
   }
 
  mTouchEvents.clear( );
 }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2015, 13:54     Как правильно хранить и обрабатывать TouchEvent в OpenGL-потоке?
Посмотрите здесь:

OpenGL ES2: touchEvent валится на API 21+ - Программирование Android
На андроиде 4 проблем нет, на 5-м и выше 02-16 04:06:36.715 5800-5836/com.ea.projectionof4dspace A/libc: Fatal signal 11...

Обработка touchEvent в OverlayView - Программирование Android
И всё же, кто подскажет, по какому принципу обрабатываются нажатия, при создании View из сервиса. Например, таким способом(взял из...

Как обрабатывать не только View элементы - Программирование Android
ImageView btn1 = (ImageView)findViewById(R.drawable.gorod_cveta_button1); final Animation anim1 =...

Как обрабатывать ошибки, когда трассировка стека не имеет пакета приложения? - Программирование Android
Например вот: java.lang.NullPointerException at...

Как работает шаблон NavigationDrawer в AndroidStudio, где обрабатывать нажатия на навигационной панели? - Программирование Android
Всем здрасьте! Не могу никак понять, где в шаблоне, который генерирует Android Studio, вешать обработки нажатия на соответствующую...

Как хранить результаты пользователей - Программирование Android
Доброй ночи! Хочу попробовать сделать приложение, простой тест, за правильный ответ игрок получает очки. Хочется что бы игроки заходили пол...

Как мне хранить этап игры? - Программирование Android
Доброго времени суток! Мне нужно хранить переменную, которая изначально будет равна нулю и будет запоминаться в памяти, чтобы после...

Как загружать/хранить файл в SQLite? - Программирование Android
Есть список, нужно по клику на айтеме открывать текстовый файл или картинку, и вопрос стоит в том как их доблять к определенному айтему с...

Как хранить данные в интернете (хостинг, облако)? - Программирование Android
Здравствуйте , уважаемые программисты! Не могли бы вы мне помочь? Как хранить данные андроид приложений в интернете? Что лучше...

Как хранить VKAccessToken между перезапусками приложения - Программирование Android
Доброго дня. Подскажите пожалуйста как сделать так что бы приложение не запрашивало при каждом запуске права в VK-аккаунте, т.е. что бы...

Как лучше всего хранить данные для приложения? - Программирование Android
Допустим есть статический массив интов,или булов.Как его сохранять(onDestroy()) и подгружать(onCreate), наиболее минимальным кол-вом строк...

Как реализовать бесконечный цикл в потоке? - Программирование Android
Не получается реализовать бесконечный цикл в потоке, который играет мелодию раз в секунду. Вот код: MediaPlayer player; Runnable...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru