ゲームスレッドを一時停止するホームボタンを押すと、再入力ゲームスレッド

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

  •  21-12-2019
  •  | 
  •  

質問

私は問題を抱えています

ホームボタンを押すと、私のゲームスレッドクラスが一時停止します。しかし、アプリを再入力してonResume()メソッドが呼び出されると、ゲームスレッドが再開されるはずです...私が得るevery thineは閉じます。

これは私の主な活動性です:

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

コードの無関係な部分を取り除いた。

Appを再入力するときはAndroid.View.Choreographerクラスを開く

任意のアイデア?

役に立ちましたか?

解決

実際には、あなたのスレッドを一時停止していません(厳格になるように、スレッドを一時停止するのと同じようなものはありません)。あなたはあなたのスレッドを終了しています。

pause()を呼び出すと、isRunningフラグをfalseに設定します。スレッドはループを終了し、スレッドが終了します。「iSrunning」をもう一度TRUEに設定すると、スレッドは再起動しません。

実際には、スレッドをJavaで再利用することはできません。スレッドループが終了すると、それは死んでいます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top