我最近在AndEngine上进行了探索。我编写了一个简单的测试演示,其中实现了IOnSceneTouchListener,场景中注册了一个TimerHandler来更改一个ChangableText
然后将引擎runOnUpdateThread设置为true。

所以问题是:当我触摸场景一段时间后,活动暂停并崩溃了。然后Logcat显示与以前相同的文本:“ org.anddev.andengine.util.pool.PoolUpdateHandler $ 1已用尽,其中1个尚未回收。另外分配了1个。”

如果任何人都可以解决我的问题,那么我将感激不尽!

PS:我的代码

    public class TestActivity extends BaseGameActivity implements IOnSceneTouchListener, IOnMenuItemClickListener {
    ...
    ...
    private TimerHandler mTimeUpdateHandler = new TimerHandler(1.f, true, new ITimerCallback() {
            @Override
            public void onTimePassed(TimerHandler arg0) {
                runOnUpdateThread(new Runnable() {
                    @Override
                    public void run() {
                        if (mElapsedText != null && mAttempts > 0) {
                            mElapsedText.setText("Time: "
                                    + (ParticlyActivity.this.mEngine.getSecondsElapsedTotal() - mCurrentTotalSeconds),
                                    false);
                        }
                    }
                });
            }
        });
    ...
    ...

    // @Override
        public Engine onLoadEngine() {
            this.mCamera = new BoundCamera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
            final EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE,
                    new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), mCamera).setNeedsSound(true);
            engineOptions.getTouchOptions().setRunOnUpdateThread(true);
            this.mEngine = new Engine(engineOptions);
            return this.mEngine;
        }


    public Scene onLoadScene(){
    ...
                // Text
                mElapsedText = new ChangeableText(20, 12, this.mFont, "Time:00.00");
                mScene.getFirstChild().attachChild(mElapsedText);
                mScene.registerUpdateHandler(mTimeUpdateHandler);

    ...
    }

@Override
    public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) {
            if ((pSceneTouchEvent.isActionMove() || pSceneTouchEvent.isActionDown()) && mAttempts < MaxBullets) {
                double angle = 0;
                if ((pSceneTouchEvent.getX() - StartX) == 0) {
                    angle = 90;
                } else {
                    angle = Math
                            .abs(Math.atan((StartY - pSceneTouchEvent.getY()) / (StartX - pSceneTouchEvent.getX())) / 3.14 * 180);
                }
                if (angle > 90) {
                    angle = 90;
                } else if (angle < 0) {
                    angle = 0;
                }
                mGun.setRotation((float) -angle);
                mGun.setStrength(pSceneTouchEvent.getX());
            } else if (pSceneTouchEvent.isActionUp() && mAttempts < MaxBullets) {
...
            }
        }
        return true;
    }

    }


TimerHandler:

private TimerHandler mTimeUpdateHandler = new TimerHandler(1.f, true, new ITimerCallback() {
    @Override
    public void onTimePassed(TimerHandler arg0) {
        runOnUpdateThread(new Runnable() {
            @Override
            public void run() {
                if (mElapsedText != null && mAttempts > 0) {
                    mElapsedText.setText("Time: " + (ParticlyActivity.this.mEngine.getSecondsElapsedTotal() - mCurrentTotalSeconds), false);
                }
            }
        });
    }
});

最佳答案

UIThread是负责绘制的对象,UpdateThread每帧执行一次
如果您需要更改Text值,请在UpdateThread上执行此操作[一般而言,请远离UIThread]

08-04 01:42