簡體   English   中英

Android:關於AndEngine updateThread和uiThread

[英]Android:About AndEngine updateThread and uiThread

我最近在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是負責繪制的人,如果您需要更改Text值,則每幀執行UpdateThread,在UpdateThread上執行此操作[一般而言,請遠離UIThread]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM