Android: GC_FOR_MALLOC вызвано продолжительным событием касания? - PullRequest
6 голосов
/ 28 июня 2011

Я читал вокруг и изучал touchEvents, главным образом потому, что мой ГХ взорвался, когда произошло длинное событие касания / скольжения ИЛИ много событий касания .Если я не касаюсь телефона, он просто бездействует как ~ 5 объектов, как вы можете видеть из первых нескольких GC_EXPLICIT, которые я выполнил из DDMS.Затем я начал прикасаться к экрану и скользить вокруг, и объекты взлетели около 13513 объектов и фактически вызвали GC_FOR_MALLOC, что занимает более 100 мс.Здесь был мой простой код тестирования, а ниже - журнал тега dalvicvm.Если у вас есть документация об обходных путях или причинах, или, возможно, просто еще одно подробное обсуждение этого вопроса, я бы очень ценю это! Приветствия и удачи в ваших собственных усилиях.*

[код]

    public class testClass extends Activity implements IOnSceneTouchListener{   
        int numberOfTouches = 0;        

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.main);
        }

        @Override   
        public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {                       
            numberOfTouches++;              
            return false;   
        } 

    }

[logcat]

06-28 15:24:55.317: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 5 objects / 128 bytes in 53ms
06-28 15:24:55.903: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 5 objects / 136 bytes in 59ms
06-28 15:24:56.708: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 5 objects / 128 bytes in 59ms
06-28 15:25:06.614: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 6 objects / 168 bytes in 58ms
06-28 15:25:09.833: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 7 objects / 192 bytes in 65ms
06-28 15:25:14.270: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 8 objects / 232 bytes in 59ms
06-28 15:25:18.294: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 6 objects / 160 bytes in 59ms
06-28 15:25:33.942: DEBUG/dalvikvm(1103): GC_FOR_MALLOC freed 13513 objects / 1403264 bytes in 121ms
06-28 15:26:53.684: DEBUG/dalvikvm(2139): GC_EXPLICIT freed 140 objects / 6960 bytes in 99ms
06-28 15:26:58.731: DEBUG/dalvikvm(1215): GC_EXPLICIT freed 668 objects / 71136 bytes in 117ms
06-28 15:27:31.637: DEBUG/dalvikvm(1103): GC_FOR_MALLOC freed 13962 objects / 1504296 bytes in 122ms
06-28 15:27:44.723: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 63 objects / 2152 bytes in 59ms
06-28 15:27:46.676: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 5 objects / 128 bytes in 65ms
06-28 15:27:47.238: DEBUG/dalvikvm(2501): GC_EXPLICIT freed 5 objects / 128 bytes in 58ms

Мне еще предстоит решить проблему, нонаткнулся на эту замечательную статью по этой проблеме: Проблемы с Android Touch

[править], как сказал Страчка, скорее всего, из-за наводнения.Моя настоящая проблема, однако, связана с выделениями, которые производятся для каждого события? Есть ли способ повторно использовать эти события / объекты для ограничения выделений из-за касания?

I 'm в настоящее время использует andEngine , а touchEvents объединяются, поэтому их должно быть не более ~ 5 с нуля;иначе они просто используют повторно, не так ли?

Спасибо за любые идеи ....

Ответы [ 2 ]

3 голосов
/ 29 июня 2011

Вы используете более старую версию Android?Я только что читал о проблеме «сенсорного потока» на Android 1.5 в Начало игр для Android .Обходной путь автора состоял в том, чтобы ненадолго перевести поток пользовательского интерфейса в его обработчик onTouch (), чтобы ограничить число полученных событий.Я не знаю, насколько жизнеспособно это решение, и может ли оно вам пригодиться;соответствующую страницу из книги можно найти здесь:

Начало игр для Android, стр. 131

0 голосов
/ 29 июня 2011
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            numberOfTouches++;
            //events can be handled as well.
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    invalidate();
                    break;
                case MotionEvent.ACTION_MOVE:
                    invalidate();
                    break;
                case MotionEvent.ACTION_UP:
                    invalidate();
                    break;
            }
            return true;
        }

Это освещает GC и mallocs.Это метод переопределения View.Попробуйте и ответьте ..

android.view.View.onTouchEvent (событие MotionEvent)

Ссылка:

http://developer.android.com/reference/android/view/View.html#onTouchEvent%28android.view.MotionEvent%29

...