Pausa Thread del gioco Quando viene premuto il pulsante Home, la reinsterizzazione dei recupera il filo del gioco
-
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?
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.