게임 스레드 일시 중지 홈 버튼을 누르면 다시 입력되는 게임 스레드가 다시 입력됩니다.

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

  •  21-12-2019
  •  | 
  •  

문제

문제가 있습니다

홈 버튼을 누르면 내 게임 스레드 클래스가 일시 중지됩니다.그러나 앱을 다시 입력하고 Onresume () 메서드가 호출 될 때, 게임 스레드를 재개해야합니다 ... everythin 나는 힘이 가깝습니다.

여기에 내 주된 메인이 있습니다 :

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가 렌더링하는 SurfaceView :

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.Choreographer 클래스가 열립니다

아이디어가 있습니까?

도움이 되었습니까?

해결책

실제로 스레드를 일시 중지하지 않으므로 스레드를 일시 중지하는 것과 같은 것은 없습니다.당신은 당신의 실을 끝내고 있습니다.

PAUSE ()를 호출하면 isRunning 플래그를 false로 설정하면 스레드가 루프와 스레드가 종료됩니다.'isRunning'을 다시 true로 설정하면 스레드가 다시 시작되지 않습니다.

실제로 스레드 루프가 종료되면 죽은 일단이므로 Java에서 스레드를 재사용 할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top