gpt4 book ai didi

java - Android 线程 Activity 生命周期

转载 作者:太空宇宙 更新时间:2023-11-04 11:48:19 24 4
gpt4 key购买 nike

我正在为 Android 制作游戏,当我退出游戏并再次重新启动时,我的线程遇到了一些问题。我试图中断 MainActivity 中 onPause 函数中的线程,并使用通知恢复 gamepanel 中 start 函数中的线程。它有时有效,但并没有真正暂停游戏。

暂停线程时实现 Activity 生命周期的正确方法是什么?尤其是游戏线程,在用户离开时不应调用游戏更新函数。

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;
}
}
}

扩展surfaceView的游戏面板:

@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;
}
}

最佳答案

boolean 运行周围没有内存障碍,您可以同步或使用私有(private) volatile boolean 运行;。然后你需要在某个地方调用 setRunning(false) 来停止它,但你似乎没有这样做。这些原因可能是您的线程不退出的原因。

但我不认为在单独的线程中渲染游戏有任何意义。如果您无论如何都无法超快更新和渲染(例如 1/60 秒或更好),那么将其移动到线程不会有帮助。

关于java - Android 线程 Activity 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42099707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com