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 フォーラムに残しましたが、ここではありません):クラス関数で、AndEngineコールバックを 1 回実行する を 呼び出し
ます。そして、 inに 戻った後、再度同じコールバックを実行します。 AndEngine コードをトレースすると、これによりinが 2 回も実行されることがわかります。したがって、2 つのタイマー インスタンスを作成し、2 番目のタイマーがスプラッシュ スクリーンを破棄するときに NPE を取得します。MainActivityonCreateScene()
SceneManagercreateSplashScene()onCreateSceneFinished()
OnCreateScene()MainActivity
onPopulateScene()MainActivity

于 2013-02-22T02:21:35.547 に答える