我在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)
以下是我的代码:https://github.com/mkaziz/EECS-499---Android-Shooter/commit/63dab77fe43f70543b06ea6436249c8401b339bc
的github提交链接答案 0 :(得分:1)
好的,我正在废弃我原来的答案。我仍然认为正在发生的事情是在其自己的回调中取消注册TimerHandler是通过在它(在某种意义上)“完成”之前取消对引擎的引用而导致空指针。换句话说,在调用onTimePassed()之后,TimerHandler似乎在引擎上解锁。
需要考虑的其他事项/尝试:这是否发生在您的主要更新线程中?如果没有,请考虑将其移至主线程。例如,
runOnUpdateThread(new Runnable() {
@Override
public void run() {
// put it here.
}});
答案 1 :(得分:1)
根据您的code on github(您在AndEngine forum上留下,但不在此处):
在MainActivity
班级onCreateScene()
功能中,
您拨打SceneManager
' createSplashScene()
执行AndEngine onCreateSceneFinished()
回调一次。
并且,在返回OnCreateScene()
中的MainActivity
后,您再次执行相同的回调
如果您追踪到AndEngine代码,您将知道这将导致onPopulateScene()
MainActivity
执行两次。因此,您将创建两个计时器实例,并在第二个计时器处理启动屏幕时获取NPE。