Pausa Thread del gioco Quando viene premuto il pulsante Home, la reinsterizzazione dei recupera il filo del gioco

StackOverflow https://stackoverflow.com//questions/22019904

  •  21-12-2019
  •  | 
  •  

Domanda

Ho un problema

Quando si colpisce il pulsante Home, la mia classe di gioco del gioco viene messa in pausa.Ma quando si rientrando l'app e il metodo OnResume () viene chiamato, dovrebbe riprendere il filo del gioco ... ogni volta che ottengo è una forza chiusa.

Ecco la mia Mainalty:

public class MainActivity extends Activity {

private RelativeLayout relativeLayout;
private GameView gameView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    gameView = new GameView(this, this);
    setContentView(R.layout.activity_main);
    relativeLayout = (RelativeLayout)findViewById(R.id.mainView);
    relativeLayout.addView(gameView);
}

@Override
protected void onPause() {
    super.onPause();
    gameView.pause();
}

@Override
protected void onResume() {
    super.onResume();
    if(gameView.getGameThread() != null) {
        if(gameView.getGameThread().isRunning == false) {
            gameView.resume();
        }
    }
}
}
.

GameView è la seguente classe, una surfaceview viene visualizzata da Gamethread:

public class GameView extends SurfaceView{

private GameThread gameThread;

public GameView(Context context, Activity activity) {
    super(context);

    gameThread = new GameThread(this);
    holder = getHolder();
    holder.addCallback(new SurfaceHolder.Callback() {

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {

        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            gameThread.setRunning(true);
            gameThread.start();

        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {

        }
    });
}

public GameThread getGameThread() {
    return gameThread;
}


public void update() {

}


public void pause() {
    gameThread.pause();
}

public void resume() {
    gameThread.resumeThread();
}
}
.

Questa è la classe Gamethread:

public class GameThread extends Thread{

private GameView view;
public boolean isRunning = false;

public GameThread(GameView view) {
    this.view = view;
}

public void setRunning(boolean setRunning) {
    isRunning = setRunning;
}

public void stopThread() {
    isRunning = false;
}

public void run() {
    while(isRunning) {
        Canvas c = null;
        view.update();
        try {
            c = view.getHolder().lockCanvas();
            synchronized (view.getHolder()) {
                view.draw(c);
            }
        }finally {
            if(c != null) {
                view.getHolder().unlockCanvasAndPost(c);
            }
        }
    }
}

public void startThread() {
    isRunning = true;
}

public void pause() {
    isRunning = false;
}

public void resumeThread() {
    isRunning = true;
}
}
.

Ho rimosso le parti irrilevanti del codice.

Quando si rientra nell'app la classe Android.View.Choreographer Apre

Qualche idea?

È stato utile?

Soluzione

In realtà non stai fermando il tuo thread (per essere rigoroso, non esiste una cosa come un filo di pausa).Stai finendo il tuo filo.

Quando si chiamano PAUSE () si imposta il flag isRunning su False, ciò rende il thread uscire dal loop e la fine del filo.Quando si imposta nuovamente il tuo 'isrunning' su di nuovo vero, il thread non si riavvia.

In realtà non puoi riutilizzare i fili in Java, devi crearne uno nuovo, perché una volta termina il ciclo del filo, è morto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top