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

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

Восстановить пароль Регистрация
Другие темы раздела
Android Запись и чтение из внутренней памяти http://www.cyberforum.ru/android-dev/thread1603654.html
Здравствуйте. На WinPhone есть класс с двумя методами, которые сохраняют во внутреннюю память данные и загружают из неё: public static class ToolsRsue { /// <summary> /// Запись Json-файла в внутреннюю память /// </summary> /// <param name="jsonString">строка с Json-файлом</param> /// <param name="fileName">имя файла для запоминания</param>
Android OnDown OnUp на View Привет. Мне дали задание сделать событие при клике на кнопку и событие отпускания пальца с кнопки. OnClick элементарно, все понятно. Вопрос про отпускание пальца с кнопки, реализовать это событие можно только через OnTouch в ручную или есть какие еще механизмы? Добавлено через 2 часа 17 минут OnTouch прекрасно работает, написал. http://www.cyberforum.ru/android-dev/thread1603627.html
Настроить Android Studio Emmet Everywhere Android
Гуру, посоветуйте... Кто знает как эту чуду настроить/подключить??? (или посоветуйте альтернативу) Мне посоветовали Emmet Everywhere (начинающий разработчик pyton из других редакторов) как знаменитый "универсальный" механизм для авто-заполнения текста "заготовками" Нашел его здесь: https://plugins.jetbrains.com/plugin/7450?pr= А вот как использовать...
Не работает клиент/ сервер на физической машине Android
Дорогие форумчане, можете помочь мне реализовать перенос программы на физическую машину. После переноса программа не работает хотя на эмуляторе работала. Программа работает через порт 14444. Если есть идеи как пробросить или изменить на другой работающий порт. Прошу прощение если повторяюсь.
Android Неправильный выбор даты в приложении для Android http://www.cyberforum.ru/android-dev/thread1603492.html
Добрый день! Я делаю приложение в Android Studio, и в нем мне необходим был диалог для выбора даты. Я создал данный диалог, он работает, все нормально. НО, когда я выбираю в нем дату и устанавливаю её в TextBox, нумерация месяца сбивается, и показывается предыдущий месяц. К примеру, выбираю дату "6 декабря 2015 года". В теории, должно установиться значение 6.12.2015, но устанавливается почему-то...
Android Level List В уроке 164 startandroid написано, что менять уровень у Drawable мы можем методом setLevel. Я пытаюсь в коде это сделать, но ничего не происходит-белый экран. Все xml-файлы созданы для levels созданы. Помогите пожалуйста разобраться. public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { ... подробнее

Показать сообщение отдельно
gforcer18
 Аватар для gforcer18
1 / 0 / 0
Регистрация: 06.12.2015
Сообщений: 3
07.12.2015, 13:54     Как правильно хранить и обрабатывать TouchEvent в OpenGL-потоке?
Привет

Описание:
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( );
 }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 13:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru