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

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

Войти
Регистрация
Восстановить пароль
 
ASDFD12
41 / 41 / 6
Регистрация: 15.09.2012
Сообщений: 455
#1

Разгрузка onTouchEvent - Программирование Android

01.03.2014, 00:30. Просмотров 1009. Ответов 12
Метки нет (Все метки)

Пишу игру. В методе onTouchEvent у меня проходят практически все емкие операции - создание уровней игры (а это инициализация многих обьектов), проверка завершения уровня, команды перемещения игрока. Как следствия игра работает только на андроид 4.2 b выше. На других вылетает. Пишет, что сильно загружен onTouchEvent.
Подскажите как реорганизовать код, чтобы не грузить поток onTouchEvent.
Делал так ( не помогло)
В конструктору создал поток
Java
1
2
3
4
5
6
7
8
9
10
11
12
 thread = new Thread (new Runnable(){ public void run(){
isWin(); // проверка победы
            
                switch ( level )
                {
           case 1:  
 емкие операции по созданию уровня
           case 2:
емкие операции
...
...
итд
Далее в onTouchEvent

Java
1
2
3
4
5
6
7
8
9
10
11
 public boolean onTouchEvent(MotionEvent e) 
    {
        
        thread.start();
        
                    
        // перемещение игрока не помещал в отдельный поток, так как ему не доступны координаты касания
 // к тому же думаю это не сильно загрузит метод
        player.MovePlayer((int)(e.getX()/this.Scale_X),(int)( e.getY()/this.Scale_Y));
    return true;
    }
Результат - приложение вылетает и на Android 4.2
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2014, 00:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разгрузка onTouchEvent (Программирование Android):

Не срабатывает onTouchEvent - Программирование Android
Всем доброго Вечера, недавно занимаюсь программирование под Android. Каким образом реализовать корректную обработку onTouchEvent в ниже...

onTouchEvent в потоке - Программирование Android
Здравствуйте. Задача изменить с помощью onTouchEvent(MotionEvent event) переменную public int b и отрисовать графику с новым параметром в...

Обработка onTouchEvent в Activity - Программирование Android
Хочу в активити обрабатывать все прикосновения, независимого от того, были ли они на кнопке или на свободном пространстве. Однако после...

OnTouchEvent - нарисовать точку - Программирование Android
Здравствуйте! Уже который час мучаюсь с программой. В том месте где пользователь прикасается к экрану нужно нарисовать точку (Circle)....

Warning: Custom view overrides onTouchEvent but not performClick - Программирование Android
У меня есть кастомный view который перегружает onTouchEvent следующим образом. На котором и висит варнинг. @Override public boolean...

Разгрузка роутера - Сети
Всем привет! В офисе у нас частенько падает скорость, иногда и вообщем исчезает подключение к роутеру. Появилась идея настроить второй...

12
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
01.03.2014, 06:25 #2
Идея вроде верная. Тоже столкнулся с подобной проблемой. Планирую насоздавать независимых потоков. И рассылать им "команды". Например отрисовку сцены. Она отрисовывается на движение пальцев, а при быстром движении это может быть больше 100 кадров в секунду, когда реально нужно не больше 20-40. Пусть за это отвечает отдельный таймер (счетчик милисекунд в бесконечном цикле).
Но это пока теория... С кодом сильно не помогу, но когда-то использовал такой код для синхронизации потоков:

Java
1
2
3
4
5
    private static Handler Tread1_Handler = new Handler(); // заготовка для синхронизации с основным потоком!
 
        Tread1_Handler.post(new Runnable() { public void run() {
            // здесь код выполняется "потоко-безопасно"
        }});
1
ASDFD12
41 / 41 / 6
Регистрация: 15.09.2012
Сообщений: 455
01.03.2014, 22:23  [ТС] #3
В кого есть еще идеи?

Добавлено через 32 минуты
через Handler тоже не сработало
0
verylazy
Заблокирован
02.03.2014, 00:58 #4
можно ведь слушателей сделать отдельными классами, просто в конструктор этих слушателей передать минимум нужных параметров, контекст и что там понадобится
а там уже стартовать AsyncTask-и - крутая штука
1
ASDFD12
41 / 41 / 6
Регистрация: 15.09.2012
Сообщений: 455
02.03.2014, 01:02  [ТС] #5
verylazy,
Цитата Сообщение от verylazy Посмотреть сообщение
а что если заюзать AsyncTask ?
а какая разница между обычным потоком и AsynkTask?
Цитата Сообщение от verylazy Посмотреть сообщение
и можно ведь слушателей сделать отдельными классами
можно схематично показать и что это поменяет?
0
verylazy
Заблокирован
02.03.2014, 01:18 #6
в AsyncTaske удобно запускать что-то такое, что не будет выполняться очень долгое время, например что-то надо перерисовать в прогресс баре или качается что-то, проще найти урок на русском, мне лично хватило этого текста

насчет схематично показать, могу только завтра утром уже если кто-то добрый ночью не поможет
суть там простая - создаем класс
public class MyPWNZListener extends OntouchListener
IDE заботливо подскажет какие методы надо реализовать

в главной активити, или где там у вас все варится и весь этот большой код, там создаем объект класса MyPWNZListener myListener = new MyPWNZListener();

потом назначаем этот слушатель на какой-то ваш объект в программе, который реагирует на OnTouchEvent, кнопка или вьюшка, например

ну и вырезать и вставить код из главного активити, там где у вас switch-case-ы

Добавлено через 2 минуты
мне почему-то показалось, что "перегружен onTouchEvent" имеется ввиду что в нем реально много-много кода в одном методе одного класса
0
ASDFD12
41 / 41 / 6
Регистрация: 15.09.2012
Сообщений: 455
02.03.2014, 21:38  [ТС] #7
verylazy, спасибо, я понял. Попробуем, а в методе onTouch - помещать код (switch итд) в отдельный поток или нет? Или в AsynkTask?

Добавлено через 3 минуты
имеется ввиду метод onTouch класса MyPWNZListener

Добавлено через 20 часов 11 минут
В классе
Java
1
public class GameView extends SurfaceView
создал внутренний класс
Java
1
public class MyTouch implements OnTouchListener
куда и поместил все емкие операции и подключил класс-слушатель обьекту класса GameView
Результат :
На Android 4.2 работает. На старших версиях - вылетает.
0
verylazy
Заблокирован
03.03.2014, 11:10 #8
количество кода в switch-case уменьшилось после всего этого?
а что за ошибка?
0
ASDFD12
41 / 41 / 6
Регистрация: 15.09.2012
Сообщений: 455
03.03.2014, 12:50  [ТС] #9
Цитата Сообщение от verylazy Посмотреть сообщение
количество кода в switch-case уменьшилось после всего этого?
нет, у меня в case создается уровень, поэтому ничего уменьшить не могу
Цитата Сообщение от verylazy Посмотреть сообщение
а что за ошибка?
эмулятор начал выделываться не могу посмотреть логи

Добавлено через 8 минут
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
03-03 08:45:30.083: E/AndroidRuntime(279): Uncaught handler: thread main exiting due to uncaught exception
03-03 08:45:30.276: E/AndroidRuntime(279): java.lang.NoSuchMethodError: android.view.Display.getSize
03-03 08:45:30.276: E/AndroidRuntime(279):  at com.shcherban.box_box.GameView.<init>(GameView.java:150)
03-03 08:45:30.276: E/AndroidRuntime(279):  at com.shcherban.box_box.MainActivity.onCreate(MainActivity.java:52)
03-03 08:45:30.276: E/AndroidRuntime(279):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-03 08:45:30.276: E/AndroidRuntime(279):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
03-03 08:45:30.276: E/AndroidRuntime(279):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
03-03 08:45:30.276: E/AndroidRuntime(279):  at android.app.ActivityThread.access$2200(ActivityThread.java:119)
03-03 08:45:30.276: E/AndroidRuntime(279):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
03-03 08:45:30.276: E/AndroidRuntime(279):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-03 08:45:30.276: E/AndroidRuntime(279):  at android.os.Looper.loop(Looper.java:123)
03-03 08:45:30.276: E/AndroidRuntime(279):  at android.app.ActivityThread.main(ActivityThread.java:4363)
03-03 08:45:30.276: E/AndroidRuntime(279):  at java.lang.reflect.Method.invokeNative(Native Method)
03-03 08:45:30.276: E/AndroidRuntime(279):  at java.lang.reflect.Method.invoke(Method.java:521)
03-03 08:45:30.276: E/AndroidRuntime(279):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
03-03 08:45:30.276: E/AndroidRuntime(279):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
03-03 08:45:30.276: E/AndroidRuntime(279):  at dalvik.system.NativeStart.main(Native Method)
03-03 08:45:30.403: E/dalvikvm(279): Unable to open stack trace file '/data/anr/traces.txt': Permission denied
Добавлено через 3 минуты
надо заменить
Java
1
 display.getSize(p);
каким то аналогом?
0
verylazy
Заблокирован
03.03.2014, 12:56 #10
зачем?
0
ASDFD12
41 / 41 / 6
Регистрация: 15.09.2012
Сообщений: 455
03.03.2014, 12:59  [ТС] #11
посмотрите вторую строчку в логах
0
verylazy
03.03.2014, 13:03
  #12

Не по теме:

я в шоке, как вообще можно что-то программировать и при этом вообще не понимать что в собственном коде написано
очень жалею что влез в эту тему со своим видением, устраняюсь отсюда, мне нервы дороже

0
ASDFD12
41 / 41 / 6
Регистрация: 15.09.2012
Сообщений: 455
03.03.2014, 13:10  [ТС] #13
verylazy, спасибо
0
03.03.2014, 13:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2014, 13:10
Привет! Вот еще темы с ответами:

Разгрузка видеокарты - Видеокарты
Насколько разгрузится GTX 770, работающая на мониторы 1920х1080 (основной) и 1280х1024 (дополнительный), если на дополнительный монитор...

OnTouchEvent и onDraw не меняют значение переменной - Java ME
Надо выкладывать все классы? Суть в том, что ernum не меняется в OnTouchEvent и в onDraw. int ernum = new int; public...

"Разгрузка" программы во время выполнения длительного действия - C#
Доброго времени суток! Проблема такого рода: - решается задача математического характера - есть участок кода, работающий с...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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