游戏循环中onResume之后的Android-null指针异常

时间:2011-11-30 12:02:03

标签: android onresume game-loop

我正在开发一款Android游戏。我遇到了与here

相同的问题

我尝试了等待并通知所有解决方案,如此处所示。但是一旦应用程序恢复,我就会得到Null指针异常。 这是日志猫信息。

INFO/System.out(8166): on resume
INFO/System.out(8166): !!!! IN THE GAME RESUME ---- >>> 
INFO/System.out(8166):  SURFACE CREATED
INFO/System.out(8166): thread on resume
INFO/System.out(8166): in thread game pause=true
WARN/dalvikvm(8166): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
ERROR/AndroidRuntime(8166): FATAL EXCEPTION: Thread-11
ERROR/AndroidRuntime(8166): java.lang.NullPointerException
ERROR/AndroidRuntime(8166):     at com.org.GummyBlast.GameView.onDraw(GameView.java:442)
ERROR/AndroidRuntime(8166):     at com.org.GummyBlast.GameLoopThread.run(GameLoopThread.java:88)

onSurfaceCreated和onSurfaceDestroyed

中的代码
private void init() {

    gameLoopThread = new GameLoopThread(this);
    holder = getHolder();
    holder.addCallback(new SurfaceHolder.Callback() {

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            System.out.println(" SURFACE DESTROYED");

            nullImages();
            boolean retry = true;

            //gameLoopThread.setRunning(false);
            if(!mGameIsRunning){
            while (retry) {
                try {
                    gameLoopThread.join();

                    retry = false;
                } catch (InterruptedException e) {
                }
            }
        }


    }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            System.out.println(" SURFACE CREATED");
            Log.d("surface create", "SURFACE CREATED");

            /*gameLoopThread.setRunning(true);

            gameLoopThread.start();*/
            start(holder);

        }

        public void start(SurfaceHolder holder) {
            if (!mGameIsRunning) {

                gameLoopThread.setRunning(true);
                gameLoopThread.start();
                mGameIsRunning = true;
            } else {

                gameLoopThread.onResume();
            }
        }

我的GameThread类中的代码

public class GameLoopThread extends Thread {
static final long FPS = 10;
private  GameView view;
public static boolean running = false;
public static boolean run = true;
public static boolean game_pause=true;
 private static Object mPauseLock;
 private boolean mFinished=false;
 long ticksPS = 1000 / FPS;
    long startTime;
    long sleepTime;
 SurfaceHolder holder;
public GameLoopThread(GameView view) {
     mPauseLock = new Object();

    this.view = view;
}

public GameLoopThread() {
     mPauseLock = new Object();
}


public void setRunning(boolean run) {
    running = run;
}




@Override
public void run() {
    while (running) {
        // Do stuff.
        System.out.println("in thread game pause="+Boolean.toString(game_pause));
        if (game_pause == true) {
            Canvas c = null;
            startTime = System.currentTimeMillis();
            try {
                c = view.getHolder().lockCanvas();
                synchronized (view.getHolder()) {
                    view.onDraw(c);

                }

            } finally {
                if (c != null) {
                    view.getHolder().unlockCanvasAndPost(c);
                }
            }

            sleepTime = ticksPS - (System.currentTimeMillis() - startTime);
            try {
                if (sleepTime > 0)
                    sleep(sleepTime);
                else
                    sleep(10);
            } catch (Exception e) {
                System.out.println("Error in game loop thread "+ e.getMessage());

            }
        }
        else{
        synchronized (mPauseLock) {
            while (game_pause==false) {
                try {
                    mPauseLock.wait();
                } catch (InterruptedException e) {
                }
            }
        }
        } 
    }
}
public void onPause() {
    synchronized (mPauseLock) {
        game_pause = false;
        System.out.println("thread on pause");
    }
}

/**
 * Call this on resume.
 */
public void onResume() {
    synchronized (mPauseLock) {
        game_pause = true;
        mPauseLock.notifyAll();
        System.out.println("thread on resume");
    }
}

}

活动类onPause

@Override
public void onPause() {
    super.onPause();

    System.out.println(" --- IN GAME PAUSE ---");


        gameLoopThread = new GameLoopThread();
        gameLoopThread.onPause();

      }

如何在onResume中维护游戏的状态? 谢谢

1 个答案:

答案 0 :(得分:0)

也许您需要在超类上调用onResume()

public void onResume() {
     super.onResume();
}

希望这会对你有所帮助。