Пул сенсорных событий исчерпан

У меня проблема с сенсором. У меня есть несколько словесных спрайтов, и я привязываю к ним событие касания (ниже). После того, как я коснусь одного из них несколько раз подряд, и их захочется перетащить, во-первых, событие касания не отвечает, но если я подожду секунду, то смогу перетащить. В LogCat Я получаю это:

12-28 17:23:58.979: V/AndEngine(23295): org.andengine.util.adt.pool.PoolUpdateHandler$1 исчерпан, 1 элемент еще не переработан. Выделил еще 1.

Как решить эту проблему?

Вот код события касания:

public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY)
{
    switch(pSceneTouchEvent.getAction()) {
        case TouchEvent.ACTION_DOWN:
            this.mGrabbed = true;
            break;

        case TouchEvent.ACTION_MOVE:
            if(this.mGrabbed)
                this.setPosition(pSceneTouchEvent.getX() - 18, pSceneTouchEvent.getY() - 15);
            break;

        case TouchEvent.ACTION_UP:
            if(this.mGrabbed)
            {
                this.mGrabbed = false;
                boolean found = false;
                float x1,x2,y1,y2;
                if(this.getY() < 350)
                {
                    for(int i = 0; i < positions_list.size(); i++)
                    {
                        if((word_object_list.get(a).getName().equals(positions_list.get(i).getName())) && positions_list.get(i).isFree())
                        {
                            x1 = word_object_list.get(a).getSprite().getX();
                            y1 = word_object_list.get(a).getSprite().getY();
                            x2 = positions_list.get(i).getxPosition();
                            y2 = positions_list.get(i).getyPosition();
                            x1 = Math.abs(x2-x1);
                            y1 = Math.abs(y2-y1);
                            x1 = (float) Math.pow(x1,2);
                            y1 = (float) Math.pow(y1, 2);
                            x1 = x1+y1;
                            x1 = (float) Math.sqrt(x1);
                            if(x1 < 20)
                            {
                                // Set hint's visibility false
                                if(i == 0 && sprite_word_hint_1 != null)
                                    sprite_word_hint_1.setVisible(false);
                                if(i == random_hint_position && sprite_word_hint_2 != null)
                                    sprite_word_hint_2.setVisible(false);

                                word_object_list.get(a).getSprite().setVisible(false);
                                sprite_word_true_list.get(i).setVisible(true);
                                sprite_candy_list.get(finish_state).setVisible(true);
                                finish_state ++;

                                if(finish_state == question.getWord().length())
                                {
                                    // Create new scene
                                    Game_Screen.this.getEngine().registerUpdateHandler(new TimerHandler(6.5f, new ITimerCallback() {
                                        public void onTimePassed(TimerHandler pTimerHandler) {
                                            // TODO Auto-generated method stub

                                            Game_Screen.this.getEngine().setScene(load_new_scene());
                                            remove_textures();
                                        }
                                    }));

                                    // Increase point
                                    Game_Screen.this.getEngine().registerUpdateHandler(new TimerHandler(4.3f, new ITimerCallback() {
                                        public void onTimePassed(TimerHandler pTimerHandler) {
                                            // TODO Auto-generated method stub
                                            int point = variables.getDatabase().get_point(variables.getCategory_level())+question.getWord().length();
                                            elapsedText.setText(""+point);
                                            variables.getDatabase().set_answered(question);
                                            variables.getDatabase().update_user(question, question.getWord().length(), hint_used);
                                        }
                                    }));

                                    // Cover animation
                                    sprite_cover.setRotationCenter(sprite_cover.getRotationCenterX()+20, sprite_cover.getRotationCenterY());
                                    sprite_cover.registerEntityModifier(new SequenceEntityModifier(
                                            new DelayModifier(1),
                                            new RotationModifier(1.5f, 0, 90),
                                            new DelayModifier(1.7f),
                                            new RotationModifier(1, 90, -0)
                                        )
                                    );
                                    // Candy animation
                                    for(int j = 0; j < sprite_candy_list.size(); j++)
                                    {
                                        sprite_candy_list.get(j).registerEntityModifier(new SequenceEntityModifier(
                                                new DelayModifier(2.7f),
                                                new CubicBezierCurveMoveModifier( 1.5f,  sprite_candy_list.get(j).getX(), sprite_candy_list.get(j).getY(),  165, 240, 166, 241, 275, 400, EaseQuadIn.getInstance()),
                                                new DelayModifier(0.2f),
                                                new AlphaModifier(1, 1, 0)
                                                )
                                        );
                                    }
                                }
                                positions_list.get(i).setFree(false);
                                found = true;
                                break;
                            }
                        }
                    }
                }
                if(!found)
                {
                    word_object_list.get(a).getSprite().registerEntityModifier(new MoveModifier(1, word_object_list.get(a).getSprite().getX(), word_object_list.get(a).getPositionX(), word_object_list.get(a).getSprite().getY(), word_object_list.get(a).getPositionY(),EaseQuadIn.getInstance()));
                }
            }
            break;

    }
    return true;
}

person kgnkbyl    schedule 31.10.2012    source источник
comment
Можете ли вы попробовать извлечь некоторые из ваших распределений объектов из метода onAreaTouched? Это может ускорить работу и позволить обрабатывать больше касаний за более короткий промежуток времени.   -  person Shellum    schedule 31.10.2012
comment
спасибо за ваш ответ... я вытащил некоторые переменные из метода onAreaTouched. я думаю, что это стало лучше, но это должно быть лучше. проблема может быть в модификаторах сущностей о выделении памяти?   -  person kgnkbyl    schedule 31.10.2012
comment
Я знаю, что если вы включите проверки Android lint, он попросит вас, например, переместить любые новые распределения из onDraw. Я вижу те же побочные эффекты для методов onTouch.   -  person Shellum    schedule 31.10.2012


Ответы (1)


Я нашел ответ. Когда я касаюсь спрайта несколько раз, каждый раз, когда он регистрирует модификатор сущности и стек растет, я должен ждать, пока он не опустеет. Затем я добавил

this.clearEntityModifiers();

вызов функции к началу события касания, и он отлично работает.

person kgnkbyl    schedule 01.11.2012