Android AndEngine - Как я могу обновить значение ChangeableText - PullRequest
1 голос
/ 16 декабря 2011

У меня небольшая проблема с ChangeableText в AndEngine.Я хочу знать, как обновить текст без зависания экрана?Пока я использую этот способ, но он зависает на телефоне, может быть, на 2-3 секунды:

    private void removeFace(final Sprite face) {

        hm = getIconNames();
        if(face.getUserData().equals("petrol")){

            elapsedText.setText(hm.get(25));           

            final PhysicsConnector facePhysicsConnector = this.mPhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(face);

            this.mPhysicsWorld.unregisterPhysicsConnector(facePhysicsConnector);
            this.mPhysicsWorld.destroyBody(facePhysicsConnector.getBody());
            this.mScene.unregisterTouchArea(face);
            this.mScene.detachChild(face);

        } else {

        }

        System.gc();
}

Есть идеи, как это сделать?

Ответы [ 3 ]

1 голос
/ 17 декабря 2011

Помните, что при отсоединении ребенка вы должны делать это в потоке, потому что если вы этого не сделаете, это может привести к ошибкам. Используйте эту конструкцию

runOnUpdateThread(new Runnable(){

            @Override
            public void run() {
                if(yourSprite.hasParent())
                    scene.detachChild(yourSprite);
            }});

Вы можете поместить туда весь код, если хотите, тогда ваш телефон не должен зависать

    private void removeFace(final Sprite face) {
        runOnUpdateThread(new Runnable(){
                @Override
                public void run() {
                hm = getIconNames();
                if(face.getUserData().equals("petrol")){

                    elapsedText.setText(hm.get(25));           

                    final PhysicsConnector facePhysicsConnector = this.mPhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(face);

                    this.mPhysicsWorld.unregisterPhysicsConnector(facePhysicsConnector);
                    this.mPhysicsWorld.destroyBody(facePhysicsConnector.getBody());
                    this.mScene.unregisterTouchArea(face);
                    this.mScene.detachChild(face);

                } else {

                }

                System.gc();
                }});


    }
0 голосов
/ 16 декабря 2011

Здесь есть только 3 метода, которые могут использовать long: getIconNames() и get(), и System.gc()

Другие обычно являются методами, которые возвращаются немедленно или имеют очень низкую сложность.Например, getPhysicsConnectorManager() возвращается немедленно.findPhysicsConnectorByShape, unregisterPhysicsConnector, unregisterTouchArea и detachChild имеют сложность O (n), (и большинство других методов также имеют сложность O (1) или O (n)).

Я рекомендую вам заглянуть в LogCat, и когда вызывается System.gc(), вы увидите Log.i (синее) сообщение тега dalvikvm, которое начнется с GC_EXPLICIT и даст вам некоторую информацию осколько времени заняла сборка мусора и т.д ....

Если этот вызов GC не занимает много времени, это должны быть ваши 2 метода, getIconNames() и hm.get().Вы можете поместить сообщение Log.d после каждой строки кода, которая будет записывать последнюю выполненную строку кода.Таким образом, вы можете следить за временем.

0 голосов
/ 16 декабря 2011

Вероятно, потому что вы выбираете некоторую информацию при настройке текста.

Что вы должны сделать, это получить свой

String hm = hm.get(25); //What ever the correct object is or variable. im guessing its a string or int.

Тогда

передать его изменяемому тексту, который будет установлен.

elapsedText.setText(hm);   //If its a int make sure you do String.valueOf(hm);
...