Android-Droid
Android-Droid

Reputation: 14565

Android AndEngine - How can I update ChangeableText value

I have a little problem with ChangeableText in AndEngine. I want to know how to update it's text without freezing the screen? For now I'm using this way, but it's freezing my phone for maybe 2-3 seconds :

    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();
}

Any ideas how to do that?

Upvotes: 1

Views: 1922

Answers (3)

Greg
Greg

Reputation: 1152

Remember that when you detachChild you should do this in thread because if you don't it can causes errors. Use this construction

runOnUpdateThread(new Runnable(){

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

You can put there all code if you want then your phone shouldn't freez

    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();
                }});


    }

Upvotes: 1

Jong
Jong

Reputation: 9125

The only 3 methods here that have the possibility to take long are getIconNames() and get(), and System.gc()

The others are usually methods that return immediately, or have a very low complexity. For example, getPhysicsConnectorManager() returns immediately. findPhysicsConnectorByShape, unregisterPhysicsConnector, unregisterTouchArea and detachChild all have complexity of O(n), (And most of the others methods also have complexity of O(1) or O(n)).

I recommend you to look in the LogCat and when System.gc() is called, you will see a Log.i (blue) message of the tag of dalvikvm which will begin with GC_EXPLICIT and will give you some information about how long did the garbage collection took, etc....

If that GC call isn't taking the time, it must be your 2 methods, getIconNames() and hm.get(). You can put a Log.d message after each code line, which will write the last code line executed. This way you can follow the times.

Upvotes: 0

coder_For_Life22
coder_For_Life22

Reputation: 26981

Thats probably because you are fetching some information while setting the text.

What you should do is, get your

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

Then

pass it to the Changeable text to be set.

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

Upvotes: 0

Related Questions