قم بإيقاف خيط اللعبة مؤقتًا عند الضغط على زر الصفحة الرئيسية، وإعادة الدخول إلى خيط اللعبة يستأنف

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 الفصل الدراسي، ويتم عرض surfaceView بواسطة 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.Choreographer

أيه أفكار؟

هل كانت مفيدة؟

المحلول

في الواقع، أنت لا تقوم بإيقاف سلسلة الرسائل مؤقتًا (لكي تكون صارمًا، لا يوجد شيء مثل إيقاف سلسلة الرسائل مؤقتًا).أنت تنهي موضوعك.

عندما تستدعي الإيقاف المؤقت () فإنك تقوم بتعيين isRunning إشارة إلى خطأ، مما يجعل الخيط يخرج من الحلقة وينتهي الخيط.عند ضبط "isRunning" على "صحيح" مرة أخرى، لن يتم إعادة تشغيل سلسلة الرسائل.

في الواقع، لا يمكنك إعادة استخدام سلاسل الرسائل في جافا، بل يتعين عليك إنشاء سلسلة جديدة، لأنه بمجرد انتهاء حلقة الخيط، تنتهي صلاحيتها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top