Android AndEngine - 如何更新ChangeableText值

时间:2011-12-15 21:35:38

标签: android text andengine

AndEngine中的ChangeableText有点问题。我想知道如何在不冻结屏幕的情况下更新文本?现在我正在使用这种方式,但它可能会冻结我的手机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 个答案:

答案 0 :(得分:1)

请记住,当你detachChild时,你应该在线程中执行此操作,因为如果不这样做会导致错误。使用这种结构

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


    }

答案 1 :(得分:0)

这可能是因为您在设置文本时提取了一些信息。

你应该做的是,得到你的

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

答案 2 :(得分:0)

此处只有3种方法可以使用getIconNames()get()以及System.gc()

其他通常是立即返回或复杂程度非常低的方法。例如,getPhysicsConnectorManager()立即返回。 findPhysicsConnectorByShapeunregisterPhysicsConnectorunregisterTouchAreadetachChild都具有O(n)的复杂性,(并且大多数其他方法也具有O(1)或O的复杂度( n))的

我建议您查看LogCat,当调用System.gc()时,您会看到标记为Log.i的{​​{1}}(蓝色)消息,该消息将以{{1}开头并且会给你一些关于垃圾收集花了多长时间的信息......等等。

如果GC调用没有花时间,则必须是您的2种方法,dalvikvmGC_EXPLICIT。您可以在每个代码行之后放置一条Log.d消息,该消息将写入最后执行的代码行。这样你就可以跟上时代的步伐。