按下主页按钮后,android线程暂停/恢复没有响应

时间:2012-09-17 21:40:13

标签: android multithreading resume pausing-execution

我正在制作我的第一款Android游戏,我的游戏线程出现了问题。问题是,当我暂停它并按回或主页按钮时,我收到错误。 “活动(在我的应用游戏中)没有响应。我的代码:

public class GameLoopThread extends Thread {
static final long FPS = 10;
private GameView view;
private boolean running = false;

private Object mPauseLock;
private boolean mPaused;

public GameLoopThread(GameView view) {
    this.view = view;
}

public void setRunning(boolean run) {
    running = run;
    mPauseLock = new Object();
    mPaused = false;

}

@Override
public void run() {
    long ticksPS = 1000 / FPS;
    long startTime;
    long sleepTime;
    while (running) {
        Canvas c = null;
        startTime = System.currentTimeMillis();
        try {
            c = view.getHolder().lockCanvas();
            synchronized (view.getHolder()) {
                view.onDraw(c);
            }
        } finally {
            if (c != null) {
                view.getHolder().unlockCanvasAndPost(c);
            }
        }
        sleepTime = ticksPS - (System.currentTimeMillis() - startTime);
        try {
            if (sleepTime > 0)
                sleep(sleepTime);
            else
                sleep(10);
        } catch (Exception e) {
        }

        synchronized (mPauseLock) {
            while (mPaused) {
                try {
                    mPauseLock.wait();
                } catch (InterruptedException e) {
                }
            }
        }

    }

}

/**
 * Call this on pause.
 */
public void onPause() {
    synchronized (mPauseLock) {
        mPaused = true;
    }
}

/**
 * Call this on resume.
 */
public void onResume() {
    synchronized (mPauseLock) {
        mPaused = false;
        mPauseLock.notifyAll();
     }
   }
  }

我做错了什么?

2 个答案:

答案 0 :(得分:1)

首先,您是否尝试在应用程序运行时按下电源按钮?如果在您尝试之后重新打开应用程序时应用程序仍在运行,那么您的线程代码和表面类就可以了。要解决您的问题(主页按钮部分),请将此方法添加到您的appcompatactivity中。

public class Game extends AppCompatActivity {
public int i = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(new YourSurfaceGame(this,"player1"));
}
//Add this override method to your appcompatactivity
@Override
protected void onStart() {
    super.onStart();
    //Re-declare your surface game class is the main solution here
    setContentView(new YourSurfaceGame(this,"player1"));
}

@Override
protected void onPause() {
    super.onPause();
}
}

我花了一个小时的时间来解决按钮问题虽然我在按住家用电源和电源按钮时比较了一些奇怪的东西。如果您尝试使用此代码并开始注意所有游戏进度都已消失,那么https://www.tutorialspoint.com/android/android_shared_preferences.htm就是答案。

我为其他游戏应用做了同样的事情,我的结论是正确的。按下主页或电源按钮后,游戏暂停。实际上,如果你使用扩展的线程,你会发现这个问题,当你在mainthread类中使用timertask扩展时,你会发现这个问题。虽然,我以前从未尝试过。

答案 1 :(得分:0)

您的应用程序很可能在恢复时尝试启动已停止的线程。这导致错误并导致应用程序崩溃。

查看您的Logcat日志进行检查。