2011-12-15 64 views
1

我在AndEngine中的ChangeableText有一些問題。我想知道如何在不凍結屏幕的情況下更新文本?現在我使用這種方式,但它凍結了我的手機大概2-3秒:Android AndEngine - 如何更新ChangeableText值

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

任何想法如何做到這一點?

回答

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

只有3個此方法是必須採取的可能是長和getIconNames()get()System.gc()

的人通常是立即返回,或者具有非常低複雜度的方法。例如,getPhysicsConnectorManager()立即返回。 findPhysicsConnectorByShape,unregisterPhysicsConnector,unregisterTouchAreadetachChild都具有O(n)的複雜度,(其他大多數方法也具有O(1)或O(n)的複雜度)。

,我建議你在logcat的外觀和當System.gc()被調用時,你會看到dalvikvm標籤的Log.i(藍色)消息將與GC_EXPLICIT開始,會給你多久沒有垃圾收集的一些信息花了,等...

如果該GC呼叫沒有花時間,它必須是你的2種方法,getIconNames()hm.get()。您可以在每個代碼行之後放置一條Log.d消息,它將寫入最後一個執行的代碼行。這樣你就可以跟上時代。

1

請記住,當你detachChild你應該在線程中這樣做,因爲如果你不這樣做可能會導致錯誤。使用此結構

runOnUpdateThread(new Runnable(){ 

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

你可以把那裏所有的代碼,如果你想那麼你的手機不應該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(); 
       }}); 


    }