最近做一個連連看遊戲,使用了SurfaceView畫圖。通常按下HOME鍵時,遊戲界面隱藏到後臺,再次點擊圖標進入遊戲時,應該返回之前的遊戲的狀態。
首先要理解SurfaceView的生命週期:
(1)程序第一次啓動時,調用view的構造函數->surfaceCreated->surfaceChanged
(2)按HOME鍵時,調用surfaceDestroyed;點擊圖標返回程序時,調用surfaceCreated->surfaceChanged
(3)按返回鍵時,調用surfaceDestroyed;點擊圖標返回程序時,調用view的構造函數->調用surfaceCreated->surfaceChanged
所以正確的做法是:
(1)將線程設爲view的成員
(2)在surfaceCreated中把線程new出來,並設置運行標誌true、調用線程的start(不要在構造函數中new)
(3)在surfaceDestroyed中將運行標誌設爲false
代碼:
public class GameView extends SurfaceView implements SurfaceHolder.Callback {
private GameViewDrawThread gameViewDrawThread;
private GameActivity activity;
public GameView(GameActivity gameActivity) {
super(gameActivity);
getHolder().addCallback(this);
this.activity = gameActivity;
}
public void surfaceCreated(SurfaceHolder holder) {
gameViewDrawThread = new GameViewDrawThread(this);
gameViewDrawThread.setRunning(true);
gameViewDrawThread.start();
}
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}
public void surfaceDestroyed(SurfaceHolder holder) {
gameViewDrawThread.setRunning(false);
}
}
public class GameViewDrawThread extends Thread {
GameView gameView;
private boolean isRunning = true;
SurfaceHolder surfaceHolder;
public void setRunning(boolean bRun) {
isRunning = bRun;
}
public GameViewDrawThread(GameView gameView) {
this.gameView = gameView;
this.surfaceHolder = gameView.getHolder();
}
public void run() {
Canvas c;
while (isRunning == true) {
c = null;
try {
c = this.surfaceHolder.lockCanvas();
synchronized (this.surfaceHolder) {
gameView.doDraw(c);
}
} finally {
if (c != null) {
this.surfaceHolder.unlockCanvasAndPost(c);
}
}
try {
Thread.sleep(50);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
沒看懂的,可以參考http://blog.csdn.net/xiaominghimi/article/details/6149816