قم بإيقاف خيط اللعبة مؤقتًا عند الضغط على زر الصفحة الرئيسية، وإعادة الدخول إلى خيط اللعبة يستأنف
-
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" على "صحيح" مرة أخرى، لن يتم إعادة تشغيل سلسلة الرسائل.
في الواقع، لا يمكنك إعادة استخدام سلاسل الرسائل في جافا، بل يتعين عليك إنشاء سلسلة جديدة، لأنه بمجرد انتهاء حلقة الخيط، تنتهي صلاحيتها.