我正在为 android 制作一款游戏,当我退出游戏并再次重新启动游戏时,我的线程遇到了一些问题。我正在尝试中断 MainActivity 中 onPause 函数中的线程,并通过通知恢复游戏面板中启动函数中的线程。它有时会起作用,但它并没有真正暂停游戏。
在暂停线程时实现活动生命周期的正确方法是什么?尤其是用户不在时不应调用游戏更新函数的游戏线程。
public class MainActivity extends Activity {
private GamePanel gamepanel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//removes title
requestWindowFeature(Window.FEATURE_NO_TITLE);
//full screen
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
gamepanel = new GamePanel(this);
setContentView(gamepanel);
SoundHandler.setContext(this);
}
@Override
protected void onPause() {
super.onPause();
gamepanel.getThread().interrupt();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
boolean retry = true;
while (retry) {
try {
gamepanel.getThread().setRunning(false);
gamepanel.getThread().join();
} catch (InterruptedException e) {
e.printStackTrace();
}
retry = false;
}
}
}
扩展表面视图的游戏面板:
@Override
public void surfaceDestroyed (SurfaceHolder holder){}
/**create surface.
*
* @param holder
*/
@Override
public void surfaceCreated (SurfaceHolder holder){
//we can safely start the game loop
System.out.println("CREATING SURFACE");
loadingscreen = false;
start();
}
public void start() {
if(!mGameIsRunning) {
thread.start();
thread.setRunning(true);
mGameIsRunning = true;
} else {
thread.onResume();
}
}
线程类
public class MainThread extends Thread {
private SurfaceHolder surfaceHolder;
private GamePanel gamePanel;
public boolean running = false;
public static Canvas canvas;
private long startTime;
private long fps = 1/30;
public MainThread(SurfaceHolder surfaceHolder, GamePanel gamePanel) {
super();
this.surfaceHolder = surfaceHolder;
this.gamePanel = gamePanel;
startTime = System.nanoTime();
}
@Override
public void run()
{
while(running) {
if((System.nanoTime() - startTime) / 1000000000> fps) {
canvas = null;
//try locking the canvas for pixel editing
try {
canvas = surfaceHolder.lockCanvas();
synchronized (surfaceHolder) {
this.gamePanel.update();
this.gamePanel.draw(canvas);
this.gamePanel.checkSpeed();
}
} catch (Exception e) {
} finally {
if (canvas != null) {
try {
surfaceHolder.unlockCanvasAndPost(canvas);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
gamePanel.surfaceDestroyed(surfaceHolder);
}
public void onResume(){
synchronized(this){
this.notify();
}
}
public void setRunning(boolean b)
{
running=b;
}
public boolean getRunning(){
return running;
}
}
synchronize
或使用private volatile boolean running;
boolean running
周围没有内存障碍。然后你需要打电话给setRunning(false)
某个地方来阻止它,你似乎没有这样做。这些原因可能是您的线程没有退出的原因。
但我认为无论如何在单独的线程中渲染游戏没有任何意义。如果你无论如何都不能超快地更新和渲染(例如1/60秒或更好(,那么将其移动到线程将无济于事。