1

我在 AndEngine 中使用了一个计时器,但它向我抛出了这个错误。

这是引发错误的方法:

public void onPopulateScene(Scene pScene,
        OnPopulateSceneCallback pOnPopulateSceneCallback) throws Exception {
    mEngine.registerUpdateHandler(new TimerHandler(3f,
            new ITimerCallback() {
                @Override
                public void onTimePassed(final TimerHandler pTimerHandler) {
                    SceneManager.getInstance().createMenuScene();
                    mEngine.unregisterUpdateHandler(pTimerHandler);
                }
            }));
    pOnPopulateSceneCallback.onPopulateSceneFinished();
}

我在 Engine 类中将它跟踪到这一行:

        } finally {
            this.mEngineLock.unlock();
        }

任何人都可以帮忙吗?

02-21 03:39:55.056: E/AndroidRuntime(27796): FATAL EXCEPTION: UpdateThread
02-21 03:39:55.056: E/AndroidRuntime(27796): java.lang.NullPointerException
02-21 03:39:55.056: E/AndroidRuntime(27796):    at edu.ian.andenginetest.SceneManager.disposeSplashScene(SceneManager.java:50)
02-21 03:39:55.056: E/AndroidRuntime(27796):    at edu.ian.andenginetest.SceneManager.createMenuScene(SceneManager.java:57)
02-21 03:39:55.056: E/AndroidRuntime(27796):    at edu.ian.andenginetest.MainActivity$1.onTimePassed(MainActivity.java:73)
02-21 03:39:55.056: E/AndroidRuntime(27796):    at org.andengine.engine.handler.timer.TimerHandler.onUpdate(TimerHandler.java:98)
02-21 03:39:55.056: E/AndroidRuntime(27796):    at org.andengine.engine.handler.UpdateHandlerList.onUpdate(UpdateHandlerList.java:47)
02-21 03:39:55.056: E/AndroidRuntime(27796):    at org.andengine.engine.Engine.onUpdateUpdateHandlers(Engine.java:597)
02-21 03:39:55.056: E/AndroidRuntime(27796):    at org.andengine.engine.Engine.onUpdate(Engine.java:585)
02-21 03:39:55.056: E/AndroidRuntime(27796):    at org.andengine.engine.LimitedFPSEngine.onUpdate(LimitedFPSEngine.java:56)
02-21 03:39:55.056: E/AndroidRuntime(27796):    at org.andengine.engine.Engine.onTickUpdate(Engine.java:548)
02-21 03:39:55.056: E/AndroidRuntime(27796):    at org.andengine.engine.Engine$UpdateThread.run(Engine.java:820)

这是我的代码到 github 提交的链接:https ://github.com/mkaziz/EECS-499---Android-Shooter/commit/63dab77fe43f70543b06ea6436249c8401b339bc

4

2 回答 2

1

好的,我放弃了我原来的大部分答案。我仍然认为正在发生的事情是在它自己的回调中取消注册 TimerHandler 导致空指针通过在它(在某种意义上)“完成”之前取消它对引擎的引用。换句话说,TimerHandler 似乎在调用 onTimePassed()后在引擎上进行了解锁。

其他需要考虑/尝试的事情:这是否发生在您的主更新线程中?如果没有,请考虑将其移至主线程。例如,

runOnUpdateThread(new Runnable() {

    @Override
    public void run() {
          // put it here.


}});
于 2013-02-22T00:40:11.483 回答
1

根据您在 github 上的代码(您离开AndEngine 论坛,但不在此处):
在您的MainActivityonCreateScene()函数中,
您调用SceneManager'screateSplashScene()执行onCreateSceneFinished()一次 AndEngine 回调。
并且,在返回OnCreateScene()in之后MainActivity,您再次执行相同的回调。
如果你跟踪到 AndEngine 代码,你会知道这也会导致onPopulateScene()inMainActivity执行两次。因此,您将创建两个计时器实例,并在第二个计时器处理启动画面时获得 NPE。

于 2013-02-22T02:21:35.547 回答