Пауза Игровой поток Когда нажата домашняя кнопка, повторное ввод возобновляет игру

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

  •  21-12-2019
  •  | 
  •  

Вопрос

У меня есть проблема

При попадании на домашнюю кнопку, у моего игрового потока класс делает паузу.Но при повторном входе в приложение и метод OnResume () вызывается, он должен возобновить игру в игре ... Всегда я получаю, это сила закрытия.

Вот моя мрадиционность:

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 состоит в следующем классе, поверхность просмотра оказывается 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();
}
}
.

Это класс 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;
}
}
.

Я удалил нерелевантные части кода.

При повторном входе в приложение Android.View.Choreographor Class открывается

Любые идеи?

Это было полезно?

Решение

На самом деле вы не останавливаете свою ниту (чтобы быть строгими, такая вещь, как паузания нити).Вы заканчиваете свою нить.

При вызове Pause () вы устанавливаете флаг isRunning в False, что делает резьб выйти из цикла и нить заканчивается.Когда вы снова устанавливаете свой «Isrunning», нить не перезагрузится.

На самом деле вы не можете повторно использовать потоки в Java, вы должны создать новый, потому что после окончания петли потока она мертва.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top