【发布时间】:2012-09-17 21:40:13
【问题描述】:
我正在制作我的第一个 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();
}
}
}
我做错了什么?
【问题讨论】:
-
你能提供一个 LogCat 输出吗?
-
你有一个while循环:while (mPaused) { ...你等一次,够了,或者应该够了。
-
而且我不认为你必须给你这么多同步,因为那只适用于可以被多个线程修改的对象。
-
您还有其他方法可以暂停和恢复线程吗?这是我在网上找到的代码组成的
-
我看到的第一个问题是私有字段“运行”不是易失性的。编译器可能会假设,因为没有其他线程会修改它,所以只需内联代码。
标签: android multithreading resume pausing-execution