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();
}
任何想法如何做到这一点?
答案 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()
立即返回。 findPhysicsConnectorByShape
,unregisterPhysicsConnector
,unregisterTouchArea
和detachChild
都具有O(n)的复杂性,(并且大多数其他方法也具有O(1)或O的复杂度( n))的
我建议您查看LogCat,当调用System.gc()
时,您会看到标记为Log.i
的{{1}}(蓝色)消息,该消息将以{{1}开头并且会给你一些关于垃圾收集花了多长时间的信息......等等。
如果GC调用没有花时间,则必须是您的2种方法,dalvikvm
和GC_EXPLICIT
。您可以在每个代码行之后放置一条Log.d消息,该消息将写入最后执行的代码行。这样你就可以跟上时代的步伐。