Der Spielthread wird angehalten, wenn die Home-Taste gedrückt wird. Durch erneutes Aufrufen wird der Spielthread fortgesetzt

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

  •  21-12-2019
  •  | 
  •  

Frage

Ich habe ein Problem

Wenn ich auf die Home-Taste drücke, wird meine Spiel-Thread-Klasse angehalten.Aber wenn Sie die App erneut aufrufen und die Methode onResume() aufgerufen wird, sollte sie den Spielthread fortsetzen ...Alles, was ich bekomme, ist eine Kraft in der Nähe.

Hier ist meine Hauptaktivität:

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 ist die folgende Klasse, eine surfaceView, die von GameThread gerendert wird:

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

Dies ist die GameThread-Klasse:

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

Ich habe die irrelevanten Teile des Codes entfernt.

Beim erneuten Aufrufen der App wird die Klasse android.view.Choreographer geöffnet

Irgendwelche Ideen?

War es hilfreich?

Lösung

Eigentlich pausieren Sie Ihren Thread nicht (genau genommen gibt es so etwas wie das Pausieren eines Threads nicht).Du beendest deinen Thread.

Wenn Sie pause() aufrufen, legen Sie fest isRunning Flag auf „false“ setzen, wodurch der Thread die Schleife verlässt und der Thread endet.Wenn Sie „isRunning“ wieder auf „true“ setzen, wird der Thread nicht neu gestartet.

Eigentlich kann man Threads in Java nicht wiederverwenden, man muss einen neuen erstellen, denn sobald die Thread-Schleife endet, ist sie tot.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top