安卓线程活动生命周期



我正在为 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秒或更好(,那么将其移动到线程将无济于事。

最新更新