mettre le fil de jeu en pause lorsque le bouton d'accueil est enfoncé, la rentrée reprend le fil de jeu

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

  •  21-12-2019
  •  | 
  •  

Question

j'ai un problème

Lorsque j'appuie sur le bouton d'accueil, ma classe de fil de jeu est mise en pause.Mais lorsque vous rentrez dans l'application et que la méthode onResume() est appelée, elle devrait reprendre le fil de jeu...tout ce que je reçois est une force proche.

Voici mon activité principale :

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 suit la classe, une surfaceView rendue par 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();
}
}

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

J'ai supprimé les parties non pertinentes du code.

Lorsque vous rentrez dans l'application, la classe android.view.Choreographer s'ouvre

Des idées?

Était-ce utile?

La solution

En fait, vous ne mettez pas votre fil de discussion en pause (pour être strict, mettre un fil de discussion en pause n'existe pas).Vous mettez fin à votre fil.

Lorsque vous appelez pause(), vous définissez le isRunning flag sur false, ce qui fait que le thread quitte la boucle et que le thread se termine.Lorsque vous définissez à nouveau votre « isRunning » sur true, le thread ne redémarre pas.

En fait, vous ne pouvez pas réutiliser les threads en Java, vous devez en créer un nouveau, car une fois la boucle du thread terminée, elle est morte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top